Claude Agent SDK cung cấp permission control để quản lý cách Claude dùng tool. Dùng permission mode và rule để định nghĩa những gì được phép tự động, và canUseTool callback để xử lý mọi thứ còn lại tại runtime.
Permission được đánh giá như thế nào
Phần tiêu đề “Permission được đánh giá như thế nào”Khi Claude yêu cầu một tool, SDK kiểm tra permission theo thứ tự này:
-
Hooks. Chạy hook trước tiên. Một hook có thể deny lời gọi hoàn toàn hoặc chuyển tiếp nó. Một hook trả về
allowkhông bỏ qua các rule deny và ask bên dưới; những rule đó vẫn được đánh giá bất kể kết quả hook. -
Deny rule. Kiểm tra
denyrule (từdisallowed_toolsvà settings.json). Nếu một deny rule khớp, tool bị chặn, kể cả trong modebypassPermissions. Deny rule dạng tên trần nhưBashloại bỏ tool khỏi context của Claude trước khi bước đánh giá này bắt đầu, nên chỉ rule có scope nhưBash(rm *)mới được kiểm tra ở bước này. -
Ask rule. Kiểm tra
askrule từ settings.json. Nếu một ask rule khớp, lời gọi rơi xuốngcanUseToolcallback của bạn để xác nhận, kể cả trong modebypassPermissions.Tool cần tương tác người dùng hoạt động tương tự:
AskUserQuestionvà MCP tool mà server của nó đặt_meta["anthropic/requiresUserInteraction"]luôn rơi xuống callback, kể cả khi một allow rule khớp. Trong modedontAskcả hai trường hợp đều bị deny thay vì rơi xuống callback, vì mode đó không bao giờ hỏi. Annotation MCP này yêu cầu Claude Code v2.1.199 trở lên.Tool claude.ai connector mà tổ chức của bạn đặt thành
askcũng rời khỏi flow ở bước này. Mọi lời gọi đều rơi xuống callback, kể cả trong modebypassPermissionsvà kể cả khi một allow rule khớp. Callback nhận reasonYour organization requires approval for this tool. Trong modedontAsk, lời gọi bị deny thay vì rơi xuống callback, vì mode đó không bao giờ hỏi. -
Permission mode. Áp dụng permission mode đang active.
bypassPermissionsapprove mọi thứ tới được bước này.acceptEditsapprove các thao tác file.planchuyển tool sửa file và tool ghi shell tớicanUseToolcallback của bạn bất kể allow rule, nên thao tác ghi không thể được tự động approve khi đang plan. Các mode khác rơi xuống bước tiếp theo. -
Allow rule. Kiểm tra
allowrule (từallowed_toolsvà settings.json). Nếu một rule khớp, tool được approve. -
canUseToolcallback. Nếu không được giải quyết bởi bất kỳ bước nào ở trên, gọicanUseToolcallback của bạn để đưa quyết định. Trong modedontAsk, bước này bị bỏ qua và tool bị deny.
Kể từ v2.1.198, nếu bạn truyền một canUseTool callback mà thứ tự đánh giá này không bao giờ chạm tới được, TypeScript SDK phát một Node.js process warning một lần khi query được khởi tạo. Code của warning là CLAUDE_SDK_CAN_USE_TOOL_SHADOWED. Hai cấu hình kích hoạt nó:
permissionMode: 'bypassPermissions', tự động approve mọi lời gọi tới được bước permission mode- Mỗi entry
allowedToolsdạng tên trần như"Read", tự động approve toàn bộ tool đó trước khi callback được hỏi
Entry có specifier như Bash(ls *) và mode acceptEdits không kích hoạt warning này, và allow rule đến từ settings file thì không nhìn thấy được với check này.
Lắng nghe bằng process.on('warning', ...) và so khớp code để log hoặc bỏ qua nó. Để chặn mọi tool call bất kể mode và rule, dùng PreToolUse hook thay vào đó.
Trang này tập trung vào allow và deny rule và permission mode. Với các bước khác:
- Hooks: chạy code tuỳ biến để allow, deny, hoặc modify tool request. Xem Kiểm soát thực thi bằng hooks.
canUseToolcallback: prompt người dùng approve tại runtime, khi không bước nào trước đó giải quyết được lời gọi. Xem Xử lý approval và user input.
Allow và deny rule
Phần tiêu đề “Allow và deny rule”allowed_tools và disallowed_tools (TypeScript: allowedTools / disallowedTools) thêm entry vào danh sách allow và deny rule trong flow đánh giá ở trên. Allow rule chỉ ảnh hưởng tới approval: một tool không nằm trong allowed_tools vẫn khả dụng với Claude và rơi xuống permission mode. Deny rule hoạt động khác nhau tuỳ vào việc nó chỉ đích danh một tool hay scope một pattern trong tool đó.
| Option | Hiệu ứng |
|---|---|
allowed_tools=["Read", "Grep"] | Read và Grep được tự động approve. Tool không có trong danh sách này vẫn tồn tại và rơi xuống permission mode và canUseTool. |
disallowed_tools=["Bash"] | Định nghĩa tool Bash bị loại khỏi request. Claude không thấy tool này và không thể thử gọi nó. |
disallowed_tools=["Bash(rm *)"] | Bash vẫn khả dụng. Lời gọi khớp rm * bị deny trong mọi permission mode, kể cả bypassPermissions. Lời gọi Bash khác rơi xuống permission mode. |
disallowed_tools=["*"] | Mọi định nghĩa tool bị loại khỏi request. Glob cho tên tool được hỗ trợ trong deny rule: "*" khớp mọi tool và "mcp__*" khớp mọi MCP tool trên mọi server. |
Allow rule chỉ chấp nhận tool-name glob sau một prefix mcp__<server>__ cố định. Phần server phải không có glob vì rule phải chỉ đích danh một server cụ thể bạn đã cấu hình: mcp__puppeteer__* khớp mọi tool từ server puppeteer, và mcp__github__get_* khớp các tool bắt đầu bằng get_ của nó. Một entry không được neo như allowed_tools=["*"] hoặc allowed_tools=["mcp__*"] bị bỏ qua kèm startup warning và không tự động approve gì cả.
Rule có scope cho Read và Edit nhận một path pattern. Rule Edit(path) chi phối mọi built-in tool ghi file, bao gồm cả Write và NotebookEdit; một rule Write(path) không bao giờ được match bởi các check permission file.
Dùng //path cho một absolute filesystem path: một deny rule Edit(//secrets/**) chặn ghi ở bất kỳ đâu dưới /secrets trên đĩa. Với một dấu slash đầu, Edit(/secrets/**) neo tại nguồn gốc của rule thay vào đó. Với rule truyền qua allowed_tools hoặc disallowed_tools, đó là working directory của session, nên rule này không chặn /secrets trên đĩa. Xem Rule Read và Edit để biết bốn dạng neo và cách rule từ settings file được resolve.
Với một agent bị khoá chặt, kết hợp allowedTools với permissionMode: "dontAsk". Tool có trong danh sách được approve, ngoại trừ các tool luôn-prompt trong Caution ở trên; mọi thứ khác bị deny thẳng thay vì prompt:
const options = { allowedTools: ["Read", "Glob", "Grep"], permissionMode: "dontAsk"};Bạn cũng có thể cấu hình allow, deny, và ask rule một cách khai báo trong .claude/settings.json. Các rule này được đọc khi setting source project được bật, mặc định là bật với các option query() mặc định. Nếu bạn đặt setting_sources (TypeScript: settingSources) tường minh, hãy bao gồm "project" để chúng áp dụng. Xem Permission settings để biết cú pháp rule.
Permission mode
Phần tiêu đề “Permission mode”Permission mode cung cấp kiểm soát toàn cục về cách Claude dùng tool. Bạn có thể đặt permission mode khi gọi query() hoặc thay đổi nó động trong lúc streaming session.
Các mode khả dụng
Phần tiêu đề “Các mode khả dụng”SDK hỗ trợ các permission mode sau:
| Mode | Mô tả | Hành vi của tool |
|---|---|---|
default | Hành vi permission chuẩn | Không tự động approve; tool không khớp rule nào kích hoạt canUseTool callback của bạn |
dontAsk | Deny thay vì prompt | Bất cứ gì chưa được allowed_tools hoặc rule pre-approve đều bị deny; connector tool tổ chức của bạn đặt thành ask và tool cần tương tác người dùng đều bị deny kể cả khi đã pre-approve. canUseTool không bao giờ được gọi |
acceptEdits | Tự động chấp nhận sửa file | Sửa file và thao tác filesystem (mkdir, rm, mv, v.v.) được tự động approve |
bypassPermissions | Bỏ qua permission check | Tool chạy không có permission prompt, trừ tool khớp một ask rule tường minh, connector tool tổ chức của bạn đặt thành ask, và tool cần tương tác người dùng (dùng cẩn thận) |
plan | Planning mode | Claude khám phá và lên plan mà không sửa source file của bạn; sửa file không bao giờ được tự động approve và prompt qua canUseTool callback của bạn |
auto | Approval phân loại bởi model | Một model classifier approve hoặc deny permission prompt. Xem Auto mode để biết mức độ khả dụng |
Đặt permission mode
Phần tiêu đề “Đặt permission mode”Bạn có thể đặt permission mode một lần khi bắt đầu một query, hoặc thay đổi nó động trong khi session đang active.
Tại thời điểm query
Phần tiêu đề “Tại thời điểm query”Truyền permission_mode (Python) hoặc permissionMode (TypeScript) khi tạo một query. Mode này áp dụng cho toàn bộ session trừ khi được thay đổi động.
import asynciofrom claude_agent_sdk import query, ClaudeAgentOptions
async def main(): async for message in query( prompt="Help me refactor this code", options=ClaudeAgentOptions( permission_mode="default", # Set the mode here ), ): if hasattr(message, "result"): print(message.result)
asyncio.run(main())import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() { for await (const message of query({ prompt: "Help me refactor this code", options: { permissionMode: "default" // Set the mode here } })) { if ("result" in message) { console.log(message.result); } }}
main();Trong khi streaming
Phần tiêu đề “Trong khi streaming”Gọi set_permission_mode() (Python) hoặc setPermissionMode() (TypeScript) để thay đổi mode giữa session. Mode mới có hiệu lực ngay lập tức cho mọi tool request tiếp theo. Điều này cho phép bạn bắt đầu chặt chẽ rồi nới lỏng permission khi độ tin cậy tăng lên, ví dụ chuyển sang acceptEdits sau khi review cách tiếp cận ban đầu của Claude.
import asynciofrom claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
async def main(): async with ClaudeSDKClient( options=ClaudeAgentOptions( permission_mode="default", # Start in default mode ) ) as client: await client.query("Help me refactor this code")
# Change mode dynamically mid-session await client.set_permission_mode("acceptEdits")
# Process messages with the new permission mode async for message in client.receive_response(): if hasattr(message, "result"): print(message.result)
asyncio.run(main())import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() { const q = query({ prompt: "Help me refactor this code", options: { permissionMode: "default" // Start in default mode } });
// Change mode dynamically mid-session await q.setPermissionMode("acceptEdits");
// Process messages with the new permission mode for await (const message of q) { if ("result" in message) { console.log(message.result); } }}
main();Chi tiết từng mode
Phần tiêu đề “Chi tiết từng mode”Accept edits mode (acceptEdits)
Phần tiêu đề “Accept edits mode (acceptEdits)”Tự động approve thao tác file để Claude có thể sửa code mà không cần prompt. Tool khác (như lệnh Bash không phải thao tác filesystem) vẫn cần permission bình thường.
Thao tác được tự động approve:
- Sửa file (tool Edit, Write)
- Lệnh filesystem:
mkdir,touch,rm,rmdir,mv,cp,sed
Cả hai chỉ áp dụng cho path bên trong working directory hoặc additionalDirectories. Path bên ngoài phạm vi đó và ghi vào path được bảo vệ vẫn prompt.
Dùng khi: bạn tin tưởng các sửa đổi của Claude và muốn lặp nhanh hơn, ví dụ khi đang prototype hoặc làm việc trong một thư mục cô lập.
Don’t ask mode (dontAsk)
Phần tiêu đề “Don’t ask mode (dontAsk)”Chuyển mọi permission prompt thành deny. Tool được pre-approve bởi allowed_tools, allow rule trong settings.json, hoặc một hook vẫn chạy bình thường. Connector tool tổ chức của bạn đặt thành ask và tool cần tương tác người dùng bị deny kể cả khi một allow rule khớp. Mọi thứ khác bị deny mà không gọi canUseTool.
Dùng khi: bạn muốn một tool surface cố định, tường minh cho một headless agent và ưu tiên hard deny hơn là dựa ngầm vào việc canUseTool không tồn tại.
Bypass permissions mode (bypassPermissions)
Phần tiêu đề “Bypass permissions mode (bypassPermissions)”Tự động approve mọi lần dùng tool mà không prompt. Hook vẫn thực thi và có thể chặn thao tác nếu cần.
Plan mode (plan)
Phần tiêu đề “Plan mode (plan)”Claude khám phá codebase và tạo một plan mà không sửa source file của bạn. Tool chỉ đọc chạy như trong default mode.
Sửa file không bao giờ được tự động approve trong plan mode, kể cả khi một allow rule khớp. Chúng prompt qua canUseTool callback của bạn thay vào đó. Trên Claude Code v2.1.212 trở lên, lệnh shell sửa file, như touch và rm, cũng chạm tới canUseTool callback của bạn theo cách tương tự.
Claude có thể dùng AskUserQuestion để làm rõ yêu cầu trước khi hoàn thiện plan. Xem Xử lý approval và user input để xử lý các prompt này.
Dùng khi: bạn muốn Claude đề xuất thay đổi mà không thực thi chúng, ví dụ khi code review hoặc khi bạn cần approve thay đổi trước khi chúng được thực hiện.
Tài nguyên liên quan
Phần tiêu đề “Tài nguyên liên quan”Với các bước khác trong flow đánh giá permission:
- Xử lý approval và user input: approval prompt tương tác và câu hỏi làm rõ
- Hướng dẫn Hooks: chạy code tuỳ biến tại các điểm chính trong vòng đời agent
- Permission rules: rule allow/deny khai báo trong
settings.json
lượt xem