Afi - Skill para Claude Code
Pré-requisitos: Instalar a CLI
Esta skill utiliza o binário afi-cli. Você deve verificar se a CLI está instalada antes de invocar qualquer comando desta skill. Se estiver faltando, instale-a primeiro:
- macOS / Linux:
bash <(curl -fsSL https://raw.githubusercontent.com/Servosity/msp-skills/main/skills/afi/install.sh) - Windows (PowerShell):
iwr -useb https://raw.githubusercontent.com/Servosity/msp-skills/main/skills/afi/install.ps1 | iex - Verifique:
afi-cli --version - Garanta que
~/.local/bin(macOS / Linux) ou%LOCALAPPDATA%\Programs\msp-skills(Windows) esteja no$PATH.
O instalador baixa os binários afi-cli e afi-mcp para ~/.local/bin
(macOS / Linux) ou %LOCALAPPDATA%\Programs\msp-skills (Windows). Ele não
registra a skill no seu agente e não escreve configuração de cliente MCP — veja
mcp-install.md para essa conexão.
Se --version relatar "comando não encontrado" após a instalação, o runtime não consegue enxergar o diretório do binário no $PATH. Não prossiga com comandos da skill até que a verificação seja bem-sucedida.
Uma CLI e servidor MCP de código aberto para Afi, cujo fornecedor desencoraja explicitamente o polling de API. Esta CLI percorre toda a hierarquia em um SQLite local uma vez (fleet-sync) e então responde perguntas em toda a frota (coverage-gaps, fleet-health, backup-stale, reconcile-licenses) offline. Um comando de desligamento protegido executa a sequência de arquivamento e liberação do próprio fornecedor com uma porta de verificação que o portal não possui.
Quando Usar Esta CLI
Use esta CLI para qualquer pergunta programática sobre frotas de backup SaaS da Afi: cobertura de backup, saúde de tarefas noturnas, violações de cota, datação de arquivos, reconciliação de licenças e a sequência protegida de arquivamento e desligamento para funcionários que estão saindo. É a escolha certa para perguntas em escala de MSP em muitos locatários, onde o portal força uma navegação por locatário e a API com limite de taxa pune o polling — sincronize uma vez, depois consulte o armazenamento local.
Antigatilhos
Não use esta CLI para:
- Realizar restaurações, exportações ou navegar por dados reais de backup — a API pública da Afi não expõe início de restauração/exportação ou download de dados; use o portal web da Afi
- Criar ou editar políticas de backup — as políticas são somente leitura na API pública; configure-as no portal
- Monitoramento em tempo real ou polling contínuo do status de tarefas — a Afi explicitamente limita e pode suspender aplicações de polling; use sincronizações agendadas
- Gerenciar contas de usuário do portal Afi, SSO ou configurações de notificação — não faz parte da superfície da API pública
Capacidades Únicas
Estas capacidades não estão disponíveis em nenhuma outra ferramenta para esta API.
Estado local que se acumula
-
fleet-sync— Percorra toda a hierarquia da Afi — instalações, organizações, locatários e depois os recursos, proteções, políticas, arquivos, cotas e estatísticas de tarefas de cada locatário — em um SQLite local em uma única passagem respeitosa.Execute isso primeiro (e em um agendamento): toda pergunta sobre a frota depois — cobertura, datação, licenciamento, scorecards — responde offline sem acionar os limites de taxa da Afi.
afi-cli fleet-sync -
coverage-gaps— Encontre recursos em um locatário que não têm proteção de backup aplicada — os pontos cegos do backup.Recorra a isso quando perguntado se cada caixa de correio, site ou unidade está realmente sendo protegida — responde perguntas de cobertura da frota que a API não consegue.
afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent -
fleet-health— Uma tabela em todos os locatários sincronizados: contagens de sucesso/falha de tarefas, lista de tarefas com falha e violações de cota.Use isso para a varredura de segunda-feira de manhã 'toda a frota está verde' em vez de navegar pelos locatários uma aba do portal por vez.
afi-cli fleet-health --since 24h --agent -
resolve— Mapeie um ID do Microsoft 365 / Google Workspace, e-mail ou nome para o recurso ou locatário canônico da Afi, incluindo expansão Multi-Geo.Execute isso antes de qualquer desligamento ou auditoria para ter certeza de qual objeto Afi corresponde a uma identidade de sistema externo.
afi-cli resolve [email protected] --agent -
reconcile-licenses— Compare as quantidades de assinaturas compradas com as contagens de recursos realmente protegidos por locatário para sinalizar super e subprovisionamento.Use isso para a verificação semanal de desvio de licenciamento que hoje requer junção manual de planilhas em duas telas do portal.
afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json -
backup-stale— Sinalize recursos protegidos cujo arquivo de backup mais recente é mais antigo que um limite — recursos protegidos mas com falha silenciosa.Use isso para capturar a classe de falha silenciosa: recursos que têm uma política associada mas cujos backups pararam silenciosamente de chegar.
afi-cli backup-stale --max-age 48h --agent -
tenant-scorecard— A postura completa de backup de um locatário: percentual de cobertura, status da última tarefa, idade do arquivo mais novo/mais antigo e estado da cota.Gere este cartão ao preparar um ticket de cliente ou QBR — o mergulho profundo por locatário que complementa o fleet-health.
afi-cli tenant-scorecard 01F000000000000411Z1101G1Y --agent --select tenant_id,coverage_pct,quotas_exceeded
Fluxos de trabalho protegidos
-
offboard— Faça backup seguro do recurso de um funcionário que está saindo, verifique se o arquivo foi criado e então libere a proteção — recusando a etapa irreversível até que o backup seja confirmado.Use isso ao desligar um funcionário para que o backup final seja verificado antes que a licença M365/GWS seja liberada — nunca perca os dados de um funcionário que sai.
afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "employee departure"
Referência de Comandos
applications — Gerenciar aplicações
afi-cli applications— Lista as instalações para a aplicação identificada pela chave de autenticação.
orgs — Gerenciar organizações
afi-cli orgs create— Cria uma nova organização filha.afi-cli orgs get— Recupera uma organização pelo seu ID.
tenants — Gerenciar locatários
afi-cli tenants <id>— Recupera um locatário pelo seu ID.
Encontrando o comando certo
Quando você sabe o que quer fazer mas não qual comando faz isso, pergunte diretamente à CLI:
$ afi-cli which "<capacidade em suas próprias palavras>"
which resolve uma consulta de capacidade em linguagem natural para o comando mais adequado do índice de funcionalidades selecionado desta CLI. Código de saída 0 significa pelo menos uma correspondência; código de saída 2 significa nenhuma correspondência confiante — recorra a --help ou use uma consulta mais restrita.
Receitas
Varredura de frota de segunda-feira
$ afi-cli fleet-sync --skip-archives && afi-cli fleet-health --failed-only --agent
Atualize o armazenamento da frota (pulando a varredura pesada de arquivos) e então liste apenas os locatários com tarefas com falha ou violações de cota.
Encontre pontos cegos de backup em um locatário
$ afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent --select items.name,items.kind,items.external_id
LEFT JOIN de recursos contra proteções, restrito aos três campos que um agente precisa para abrir tickets.
Desligue um funcionário que saiu com segurança
$ afi-cli resolve [email protected] && afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "employee departure" --dry-run
Resolva o e-mail ambíguo para o recurso canônico da Afi e então visualize a sequência protegida de backup-verificação-liberação antes de executá-la de verdade.
Capture backups com falha silenciosa
$ afi-cli backup-stale --max-age 48h --json
Recursos protegidos cujo arquivo mais recente é mais antigo que dois dias — a classe de falha que nenhuma tela do portal revela.
Verificação de desvio de licenciamento
$ afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json
Quantidades de assinaturas compradas vs contagens de recursos realmente protegidos, por locatário.
Configuração de Autenticação
Crie uma Aplicação e chave de API no portal Afi (nível de organização: Configuração → Apps; nível de locatário: Serviço → Configurações → Apps) e então defina AFI_API_KEY. A chave é enviada como o valor bruto do cabeçalho Authorization (as chaves Afi parecem com appkey-...; sem prefixo Bearer). Cada Aplicação suporta duas chaves para rotação. As chaves herdam o escopo de instalação da Aplicação — se um locatário ou organização estiver faltando nos resultados, verifique onde a Aplicação está instalada.
Execute afi-cli doctor para verificar a configuração.
Modo Agente
Adicione --agent a qualquer comando. Expande para: --json --compact --no-input --no-color --yes.
-
Encadeável — JSON em stdout, erros em stderr
-
Filtrável —
--selectmantém um subconjunto de campos. Caminhos com ponto descem em estruturas aninhadas; arrays percorrem elemento a elemento. Crítico para manter o contexto pequeno em APIs verbosas:afi-cli orgs get <org-id> --agent --select id,name,status -
Visualizável —
--dry-runmostra a requisição sem enviar -
Offline-friendly — comandos de sincronização/pesquisa podem usar o armazenamento local SQLite quando disponível
-
Não interativo — nunca pergunta, toda entrada é uma flag
-
Repetições explícitas — use
--idempotentapenas quando uma criação já existente deve contar como sucesso, e--ignore-missingapenas quando um destino de exclusão ausente deve contar como sucesso
Envelope de resposta
Comandos que leem do armazenamento local ou da API envolvem a saída em um envelope de proveniência:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}
Parseie .results para dados e .meta.source para saber se é ao vivo ou local. Um resumo legível por humanos N results (live) é impresso em stderr apenas quando stdout é um terminal E nenhuma flag de formato de máquina (--json, --csv, --compact, --quiet, --plain, --select) está definida — consumidores em pipe/agente e execuções com formato explícito recebem JSON puro em stdout.
Feedback do Agente
Quando você (ou o agente) notar algo estranho nesta CLI, registre:
afi-cli feedback "a flag --since é inclusiva mas a documentação diz exclusiva"
afi-cli feedback --stdin < notes.txt
afi-cli feedback list --json --limit 10
As entradas são armazenadas localmente em ~/.local/share/afi-cli/feedback.jsonl. Elas nunca são enviadas a menos que AFI_FEEDBACK_ENDPOINT esteja definido E --send seja passado ou AFI_FEEDBACK_AUTO_SEND=true. O comportamento padrão é apenas local.
Escreva o que te surpreendeu, não um relatório de bug. Curto, específico, uma linha: essa é a parte que se acumula.
Entrega de Saída
Todo comando aceita --deliver <sink>. A saída vai para o sink nomeado além de (ou em vez de) stdout, para que agentes possam rotear resultados de comandos sem precisar de pipes manuais. Três sinks são suportados:
| Sink | Efeito |
|---|---|
stdout | Padrão; escreve apenas em stdout |
file:<path> | Escreve atomicamente a saída em <path> (tmp + renomear) |
webhook:<url> | Faz POST do corpo da saída para a URL (application/json ou application/x-ndjson quando --compact) |
Esquemas desconhecidos são recusados com um erro estruturado nomeando o conjunto suportado. Falhas de webhook retornam não zero e registram a URL + o status HTTP em stderr.
Perfis Nomeados
Um perfil é um conjunto salvo de valores de flag, reutilizado entre invocações. Use-o quando um agente agendado chama o mesmo comando toda execução com a mesma configuração.
afi-cli profile save briefing --json
afi-cli --profile briefing orgs get <org-id>
afi-cli profile list --json
afi-cli profile show briefing
afi-cli profile delete briefing --yes
Flags explícitas sempre vencem os valores do perfil; valores do perfil vencem os padrões. agent-context lista todos os perfis disponíveis em available_profiles para que agentes de introspecção os descubram em tempo de execução.
Códigos de Saída
| Código | Significado |
|---|---|
| 0 | Sucesso |
| 2 | Erro de uso (argumentos errados) |
| 3 | Recurso não encontrado |
| 4 | Autenticação necessária |
| 5 | Erro de API (problema upstream) |
| 7 | Limite de taxa (espere e tente novamente) |
| 10 | Erro de configuração |
Análise de Argumentos
Parseie $ARGUMENTS:
- Vazio,
helpou--help→ mostra a saída deafi-cli --help - Começa com
install→ termina commcp→ instalação MCP; caso contrário → veja Pré-requisitos acima - Qualquer outra coisa → Uso Direto (execute como comando CLI com
--agent)
Instalação do Servidor MCP
- Instale o binário MCP (execute o script de instalação da seção Pré-requisitos, ou veja mcp-install.md para conexão por agente).
- Registre com Claude Code:
claude mcp add afi-mcp -- afi-mcp - Verifique:
claude mcp list
Uso Direto
- Verifique se está instalado:
which afi-cliSe não for encontrado, ofereça-se para instalar (veja Pré-requisitos no topo desta skill). - Corresponda a consulta do usuário ao melhor comando das Capacidades Únicas e Referência de Comandos acima.
- Execute com a flag
--agent:afi-cli <comando> [subcomando] [args] --agent - Se ambíguo, aprofunde-se na ajuda do subcomando:
afi-cli <comando> --help.