Servosity/afi

A primeira CLI para backup SaaS da Afi — cobertura total da API pública, além de respostas sobre cobertura em toda a frota, dados obsoletos e desligamentos que a API com limite de taxa não consegue fornecer ao vivo. Frases de ativação: `check afi backup coverage`, `which mailboxes aren't backed up in afi`, `afi fleet health`, `offboard a user from afi backup`, `afi backup stale check`, `use afi`, `run afi-cli`.

O que é afi?

Esta skill aciona o binário `afi-cli`, uma ferramenta de código aberto (CLI e servidor MCP) para a plataforma de backup SaaS Afi. Diferentemente da API oficial da Afi, que desencoraja polling e impõe limites de taxa, o `afi-cli` sincroniza toda a hierarquia de instalações, organizações e locatários em um banco de dados SQLite local com um único comando `fleet-sync`. Depois disso, ele responde offline a perguntas críticas para provedores de serviços gerenciados (MSPs): lacunas de cobertura (`coverage-gaps`), saúde da frota (`fleet-health`), backups obsoletos (`backup-stale`), reconciliação de licenças (`reconcile-licenses`) e o fluxo seguro de arquivamento e desligamento de funcionários (`offboard`). A skill suporta Claude Code, Cursor e Codex, oferecendo um modo agente (`--agent`) com saída JSON, sem interação, e perfis nomeados para automação. É ideal para operações em escala de MSP que exigem visibilidade em centenas de locatários sem sobrecarregar a API.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Servosity/msp-skills/tree/HEAD/skills/afi

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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:

  1. macOS / Linux:
    bash <(curl -fsSL https://raw.githubusercontent.com/Servosity/msp-skills/main/skills/afi/install.sh)
    
  2. Windows (PowerShell):
    iwr -useb https://raw.githubusercontent.com/Servosity/msp-skills/main/skills/afi/install.ps1 | iex
    
  3. Verifique: afi-cli --version
  4. 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 — --select manté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-run mostra 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 --idempotent apenas quando uma criação já existente deve contar como sucesso, e --ignore-missing apenas 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:

SinkEfeito
stdoutPadrã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ódigoSignificado
0Sucesso
2Erro de uso (argumentos errados)
3Recurso não encontrado
4Autenticação necessária
5Erro de API (problema upstream)
7Limite de taxa (espere e tente novamente)
10Erro de configuração

Análise de Argumentos

Parseie $ARGUMENTS:

  1. Vazio, help ou --help → mostra a saída de afi-cli --help
  2. Começa com install → termina com mcp → instalação MCP; caso contrário → veja Pré-requisitos acima
  3. Qualquer outra coisa → Uso Direto (execute como comando CLI com --agent)

Instalação do Servidor MCP

  1. 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).
  2. Registre com Claude Code:
    claude mcp add afi-mcp -- afi-mcp
    
  3. Verifique: claude mcp list

Uso Direto

  1. Verifique se está instalado: which afi-cli Se não for encontrado, ofereça-se para instalar (veja Pré-requisitos no topo desta skill).
  2. Corresponda a consulta do usuário ao melhor comando das Capacidades Únicas e Referência de Comandos acima.
  3. Execute com a flag --agent:
    afi-cli <comando> [subcomando] [args] --agent
    
  4. Se ambíguo, aprofunde-se na ajuda do subcomando: afi-cli <comando> --help.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Habilidades Relacionadas