Permissões do SDK

O Claude Code SDK fornece controles de permissão poderosos que permitem gerenciar como Claude usa ferramentas em sua aplicação. Este guia aborda como implementar sistemas de permissão usando o callback canUseTool, hooks e regras de permissão do settings.json. Para documentação completa da API, consulte a referência do TypeScript SDK.

Visão Geral

O Claude Code SDK fornece quatro maneiras complementares de controlar o uso de ferramentas:
  1. Modos de Permissão - Configurações globais de comportamento de permissão que afetam todas as ferramentas
  2. callback canUseTool - Manipulador de permissão em tempo de execução para casos não cobertos por outras regras
  3. Hooks - Controle refinado sobre cada execução de ferramenta com lógica personalizada
  4. Regras de permissão (settings.json) - Regras declarativas de permitir/negar com análise integrada de comandos bash
Casos de uso para cada abordagem:
  • Modos de permissão - Definir comportamento geral de permissão (planejamento, aceitação automática de edições, contornar verificações)
  • canUseTool - Aprovação dinâmica para casos não cobertos, solicita permissão do usuário
  • Hooks - Controle programático sobre todas as execuções de ferramentas
  • Regras de permissão - Políticas estáticas com análise inteligente de comandos bash

Diagrama de Fluxo de Permissões

Ordem de Processamento: Hook PreToolUse → Regras Ask → Regras Deny → Verificação do Modo de Permissão → Regras Allow → Callback canUseTool → Hook PostToolUse

Modos de Permissão

Os modos de permissão fornecem controle global sobre como Claude usa ferramentas. Você pode definir o modo de permissão ao chamar query() ou alterá-lo dinamicamente durante sessões de streaming.

Modos Disponíveis

O SDK suporta quatro modos de permissão, cada um com comportamento diferente:
ModoDescriçãoComportamento da Ferramenta
defaultComportamento padrão de permissãoVerificações normais de permissão se aplicam
planModo de planejamento - sem execuçãoClaude pode usar apenas ferramentas somente leitura; apresenta um plano antes da execução (Atualmente não suportado no SDK)
acceptEditsAceitar edições de arquivo automaticamenteEdições de arquivo e operações do sistema de arquivos são aprovadas automaticamente
bypassPermissionsContornar todas as verificações de permissãoTodas as ferramentas executam sem prompts de permissão (use com cautela)

Definindo Modo de Permissão

Você pode definir o modo de permissão de duas maneiras:

1. Configuração Inicial

Defina o modo ao criar uma consulta:
import { query } from "@anthropic-ai/claude-code";

const result = await query({
  prompt: "Me ajude a refatorar este código",
  options: {
    permissionMode: 'default'  // Modo de permissão padrão
  }
});

2. Mudanças Dinâmicas de Modo (Apenas Streaming)

Altere o modo durante uma sessão de streaming:
import { query } from "@anthropic-ai/claude-code";

// Crie um gerador assíncrono para entrada de streaming
async function* streamInput() {
  yield { 
    type: 'user',
    message: { 
      role: 'user', 
      content: "Vamos começar com permissões padrão" 
    }
  };
  
  // Mais tarde na conversa...
  yield {
    type: 'user',
    message: {
      role: 'user',
      content: "Agora vamos acelerar o desenvolvimento"
    }
  };
}

const q = query({
  prompt: streamInput(),
  options: {
    permissionMode: 'default'  // Começar no modo padrão
  }
});

// Alterar modo dinamicamente
await q.setPermissionMode('acceptEdits');

// Processar mensagens
for await (const message of q) {
  console.log(message);
}

Comportamentos Específicos do Modo

Modo Aceitar Edições (acceptEdits)

No modo aceitar edições:
  • Todas as edições de arquivo são aprovadas automaticamente
  • Operações do sistema de arquivos (mkdir, touch, rm, etc.) são aprovadas automaticamente
  • Outras ferramentas ainda requerem permissões normais
  • Acelera o desenvolvimento quando você confia nas edições do Claude
  • Útil para prototipagem rápida e iterações
Operações aprovadas automaticamente:
  • Edições de arquivo (ferramentas Edit, MultiEdit, Write)
  • Comandos bash do sistema de arquivos (mkdir, touch, rm, mv, cp)
  • Criação e exclusão de arquivos

Modo Contornar Permissões (bypassPermissions)

No modo contornar permissões:
  • TODOS os usos de ferramentas são aprovados automaticamente
  • Nenhum prompt de permissão aparece
  • Hooks ainda executam (ainda podem bloquear operações)
  • Use com extrema cautela - Claude tem acesso completo ao sistema
  • Recomendado apenas para ambientes controlados

Prioridade do Modo no Fluxo de Permissões

Os modos de permissão são avaliados em um ponto específico no fluxo de permissões:
  1. Hooks executam primeiro - Podem sobrescrever qualquer modo
  2. Regras de negação são verificadas - Bloqueiam ferramentas independentemente do modo
  3. Modo bypassPermissions - Se ativo, permite todas as ferramentas restantes
  4. Regras de permissão são verificadas
  5. Outros modos afetam comportamentos específicos de ferramentas
  6. Callback canUseTool - Lida com casos restantes
Isso significa:
  • Hooks sempre podem bloquear o uso de ferramentas, mesmo no modo bypassPermissions
  • Regras de negação explícitas sobrescrevem todos os modos de permissão
  • O modo bypassPermissions sobrescreve regras de permissão e canUseTool

Melhores Práticas

  1. Use o modo padrão para execução controlada com verificações normais de permissão
  2. Use o modo acceptEdits ao trabalhar em arquivos ou diretórios isolados
  3. Evite bypassPermissions em produção ou em sistemas com dados sensíveis
  4. Combine modos com hooks para controle refinado
  5. Alterne modos dinamicamente baseado no progresso da tarefa e confiança
Exemplo de progressão de modo:
// Começar no modo padrão para execução controlada
permissionMode: 'default'

// Alternar para acceptEdits para iteração rápida
await q.setPermissionMode('acceptEdits')

canUseTool

O callback canUseTool é passado como uma opção ao chamar a função query. Ele recebe o nome da ferramenta e parâmetros de entrada, e deve retornar uma decisão - permitir ou negar. canUseTool dispara sempre que Claude Code mostraria um prompt de permissão para um usuário, por exemplo, hooks e regras de permissão não cobrem isso e não está no modo de aceitação automática. Aqui está um exemplo completo mostrando como implementar aprovação interativa de ferramentas:
import { query } from "@anthropic-ai/claude-code";

async function promptForToolApproval(toolName: string, input: any) {
  console.log("\n🔧 Solicitação de Ferramenta:");
  console.log(`   Ferramenta: ${toolName}`);
  
  // Exibir parâmetros da ferramenta
  if (input && Object.keys(input).length > 0) {
    console.log("   Parâmetros:");
    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}`);
    }
  }
  
  // Obter aprovação do usuário (substitua pela sua lógica de UI)
  const approved = await getUserApproval();
  
  if (approved) {
    console.log("   ✅ Aprovado\n");
    return {
      behavior: "allow",
      updatedInput: input
    };
  } else {
    console.log("   ❌ Negado\n");
    return {
      behavior: "deny",
      message: "Usuário negou permissão para esta ferramenta"
    };
  }
}

// Use o callback de permissão
const result = await query({
  prompt: "Me ajude a analisar esta base de código",
  options: {
    canUseTool: async (toolName, input) => {
      return promptForToolApproval(toolName, input);
    }
  }
});

Usando Hooks para Controle de Ferramentas

Hooks fornecem controle programático sobre a execução de ferramentas em vários estágios. Hooks são chamados para cada uso de ferramenta, dando a você controle completo sobre o pipeline de permissões.

Implementação de Hook

import { query } from "@anthropic-ai/claude-code";

const result = await query({
  prompt: "Me ajude a refatorar este código",
  options: {
    hooks: {
      PreToolUse: [{
        hooks: [async (input, toolUseId, { signal }) => {
          console.log(`Solicitação de ferramenta: ${input.tool_name}`);
          
          // Analise e valide a entrada da ferramenta você mesmo
          if (input.tool_name === "Bash") {
            const command = input.tool_input.command;
            if (command.startsWith("rm -rf")) {
              return {
                decision: "block",
                reason: "Comando perigoso bloqueado"
              };
            }
          }
          
          return { continue: true };
        }]
      }],
      PostToolUse: [{
        hooks: [async (input, toolUseId, { signal }) => {
          console.log(`Ferramenta concluída: ${input.tool_name}`);
          // Registrar ou auditar resultados da ferramenta
          return { continue: true };
        }]
      }]
    }
  }
});

Principais Diferenças do canUseTool

  • Escopo: Hooks são chamados para todos os usos de ferramentas; canUseTool lida com casos não cobertos por regras de permissão
  • Controle: Hooks requerem análise e validação de entradas por conta própria
  • Eventos: Hooks suportam múltiplos eventos (PreToolUse, PostToolUse, etc.) para diferentes estágios

Usando Regras de Permissão (settings.json)

Regras de permissão em settings.json fornecem controle declarativo com análise integrada de comandos bash. Essas regras são avaliadas antes de canUseTool ser chamado. Para mais detalhes sobre configuração de settings, consulte a documentação de configurações do Claude Code.

Estrutura de Configuração

{
  "permissions": {
    "allow": [
      "Bash(npm run lint)",
      "Bash(npm run test:*)",
      "Read(~/.zshrc)"
    ],
    "deny": [
      "Bash(curl:*)",
      "Read(./.env)",
      "Read(./secrets/**)",
      "WebFetch"
    ],
    "ask": [
      "Bash(git push:*)",
      "Write(./production/**)"
    ]
  }
}

Sintaxe de Regras

Regras de permissão seguem o padrão: NomeDaFerramenta(padrão)
  • Regras Bash: Usam correspondência de prefixo (não regex). Exemplo: Bash(npm:*) corresponde a qualquer comando começando com “npm”
  • Regras de arquivo: Suportam padrões glob. Exemplo: Read(./src/**/*.ts) corresponde a arquivos TypeScript em src
  • Regras apenas de ferramenta: Omitir parênteses para controlar ferramentas inteiras. Exemplo: WebFetch bloqueia todas as buscas web

Usando com SDK

Embora as regras ainda não possam ser definidas programaticamente no SDK, elas serão lidas do arquivo settings.json no caminho onde o SDK é carregado.

Ordem de Avaliação de Permissões

  1. Regras de negação são verificadas primeiro - se corresponderem, o uso da ferramenta é bloqueado
  2. Regras de permissão são verificadas em seguida - se corresponderem, o uso da ferramenta é permitido
  3. Regras de pergunta são verificadas - se corresponderem, o usuário é solicitado
  4. Callback canUseTool é invocado para quaisquer casos restantes

Análise de Comandos Bash

O SDK inclui um analisador bash integrado que entende a estrutura de comandos:
  • Lida com pipes, redirecionamentos e substituição de comandos
  • Reconhece padrões perigosos como rm -rf ou curl | sh
  • Suporta wildcards e correspondência de prefixo
Exemplo de como padrões bash funcionam:
  • Bash(git:*) - Corresponde a qualquer comando git
  • Bash(npm run test) - Corresponde ao comando exato
  • Bash(npm run test:*) - Corresponde a npm run test:unit, test:integration, etc.

Melhores Práticas

  1. Comece com o modo padrão para verificações padrão de permissão
  2. Use regras de permissão para políticas estáticas, especialmente comandos bash (consulte configurações de permissão)
  3. Use hooks para registrar, auditar ou transformar todos os usos de ferramentas (consulte tipos de hook)
  4. Use canUseTool para decisões dinâmicas em casos não cobertos (consulte tipo CanUseTool)
  5. Camadas de defesa combinando modos, regras, hooks e callbacks para aplicações críticas