Servosity/afi

Le premier CLI pour la sauvegarde SaaS Afi – couverture complète de l'API publique ainsi que les réponses sur la couverture à l'échelle du parc, l'obsolescence et la sortie des utilisateurs que l'API limitée en débit ne peut pas fournir en direct. Phrases de déclenchement : `vérifier la couverture de sauvegarde Afi`, `quelles boîtes aux lettres ne sont pas sauvegardées dans Afi`, `santé du parc Afi`, `sortir un utilisateur de la sauvegarde Afi`, `vérification des sauvegardes obsolètes Afi`, `utiliser Afi`, `exécuter afi-cli`.

Qu'est-ce que afi ?

Ce skill permet aux agents IA (comme Claude Code) de piloter l'outil en ligne de commande `afi-cli` pour interroger et gérer les sauvegardes SaaS de la plateforme Afi à l'échelle d'un parc de clients. Il résout un problème clé : l'API publique d'Afi est limitée en débit et déconseille le polling intensif. La solution consiste à synchroniser l'ensemble de la hiérarchie Afi (installations, organisations, locataires, ressources) une seule fois dans une base SQLite locale via la commande `fleet-sync`. Ensuite, toutes les questions sur le parc (lacunes de couverture, santé des tâches, licences obsolètes, etc.) trouvent une réponse immédiate et hors ligne, sans épuiser les quotas de l'API. Le skill expose également des workflows « gardés », comme la procédure de sortie d'utilisateur (`offboard`) qui vérifie que la dernière sauvegarde a bien été archivée avant de libérer la protection. Il est conçu pour les environnements multi-locataires typiques des MSP, là où le portail web force une navigation locataire par locataire. La documentation détaille l'installation, l'authentification par clé d'API, le mode agent (sortie JSON, non interactif), les profils nommés, la livraison des résultats (fichier, webhook), et une liste de recettes prêtes à l'emploi (balayage du lundi, lacunes de couverture, vérification des échecs silencieux, etc.).

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Afi – Skill Claude Code

Prérequis : Installer le CLI

Ce skill exploite le binaire afi-cli. Vous devez vérifier que le CLI est installé avant d'invoquer une commande de ce skill. S'il est manquant, installez-le d'abord :

  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. Vérifier : afi-cli --version
  4. Assurez-vous que ~/.local/bin (macOS / Linux) ou %LOCALAPPDATA%\Programs\msp-skills (Windows) est dans $PATH.

Le programme d'installation télécharge les binaires afi-cli et afi-mcp dans ~/.local/bin (macOS / Linux) ou %LOCALAPPDATA%\Programs\msp-skills (Windows). Il n'enregistre pas le skill auprès de votre agent et n'écrit aucune configuration client MCP – reportez-vous à mcp-install.md pour ce câblage.

Si --version indique « command not found » après l'installation, l'environnement d'exécution ne voit pas le répertoire des binaires dans $PATH. Ne poursuivez pas avec les commandes du skill tant que la vérification n'est pas réussie.

Un CLI et serveur MCP open source pour Afi, dont le fournisseur décourage explicitement le polling de l'API. Ce CLI parcourt toute la hiérarchie dans du SQLite local une seule fois (fleet-sync), puis répond aux questions sur le parc (lacunes de couverture, santé du parc, sauvegardes obsolètes, réconciliation des licences) hors ligne. Une commande de sortie (offboard) protégée exécute la séquence archive-puis-suppression du fournisseur avec une passerelle de vérification que le portail ne possède pas.

Quand utiliser ce CLI

Utilisez ce CLI pour toute question programmatique sur les parcs de sauvegarde SaaS Afi : couverture de sauvegarde, santé des tâches nocturnes, dépassements de quota, obsolescence des archives, réconciliation des licences, et la séquence protégée d'archivage et de sortie pour les employés partants. C'est le choix approprié pour les questions à l'échelle MSP impliquant de nombreux locataires, là où le portail force une navigation locataire par locataire et où l'API limitée en débit pénalise le polling – synchronisez une fois, puis interrogez le magasin local.

Anti-déclencheurs

N'utilisez pas ce CLI pour :

  • Effectuer des restaurations, des exportations ou parcourir les données de sauvegarde réelles – l'API publique d'Afi n'expose pas le lancement de restauration/exportation ni le téléchargement de données ; utilisez le portail web Afi
  • Créer ou modifier des politiques de sauvegarde – les politiques sont en lecture seule dans l'API publique ; configurez-les dans le portail
  • Surveillance en temps réel ou polling continu de l'état des tâches – Afi limite explicitement et peut suspendre les applications de polling ; utilisez plutôt des synchronisations planifiées
  • Gérer les comptes utilisateur du portail Afi, l'authentification unique (SSO) ou les paramètres de notification – cela ne fait pas partie de la surface de l'API publique

Capacités uniques

Ces capacités ne sont disponibles dans aucun autre outil pour cette API.

État local qui s'accumule

  • fleet-sync – Parcourir toute la hiérarchie Afi – installations, organisations, locataires, puis les ressources, protections, politiques, archives, quotas et statistiques de tâches de chaque locataire – dans du SQLite local en un seul passage respectueux.

    Exécutez ceci en premier (et de manière planifiée) : toute question sur le parc par la suite – couverture, obsolescence, licences, tableaux de bord – répond hors ligne sans déclencher les limites de débit d'Afi.

    afi-cli fleet-sync
    
  • coverage-gaps – Trouver les ressources d'un locataire qui n'ont aucune protection de sauvegarde appliquée – les angles morts de la sauvegarde.

    Utilisez-le lorsqu'on vous demande si chaque boîte aux lettres, site ou disque est réellement sauvegardé – il répond aux questions de couverture du parc que l'API ne peut pas traiter.

    afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent
    
  • fleet-health – Un tableau pour tous les locataires synchronisés : compteurs de succès/échec des tâches, liste des tâches échouées et dépassements de quota.

    Utilisez ceci pour le tour d'horizon du lundi matin « le parc est-il tout vert ? » au lieu de parcourir les locataires un onglet de portail à la fois.

    afi-cli fleet-health --since 24h --agent
    
  • resolve – Mapper un identifiant Microsoft 365 / Google Workspace, un e-mail ou un nom vers la ressource ou le locataire Afi canonique, y compris le déploiement Multi-Geo.

    Exécutez ceci avant toute sortie ou audit pour être certain de l'objet Afi correspondant à une identité d'un système externe.

    afi-cli resolve [email protected] --agent
    
  • reconcile-licenses – Comparer les quantités d'abonnements achetés avec les nombres de ressources réellement protégées par locataire pour signaler le sur- et le sous-dimensionnement.

    Utilisez ceci pour la vérification hebdomadaire de la dérive des licences qui nécessite aujourd'hui un assemblage manuel de feuilles de calcul sur deux écrans de portail.

    afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json
    
  • backup-stale – Signaler les ressources protégées dont la sauvegarde la plus récente est plus ancienne qu'un seuil – des ressources protégées mais qui échouent silencieusement.

    Utilisez ceci pour détecter la classe des échecs silencieux : les ressources qui ont une politique attachée mais dont les sauvegardes ont cessé d'arriver.

    afi-cli backup-stale --max-age 48h --agent
    
  • tenant-scorecard – L'état complet de la sauvegarde d'un locataire : pourcentage de couverture, dernier état de tâche, âge de l'archive la plus récente/la plus ancienne et état du quota.

    Générez cette carte lors de la préparation d'un ticket client ou d'une revue d'affaires (QBR) – l'analyse approfondie par locataire qui complète fleet-health.

    afi-cli tenant-scorecard 01F000000000000411Z1101G1Y --agent --select tenant_id,coverage_pct,quotas_exceeded
    

Workflows protégés

  • offboard – Sauvegarder en toute sécurité la ressource d'un utilisateur partant, vérifier que l'archive a bien été créée, puis libérer la protection – en refusant l'étape irréversible tant que la sauvegarde n'est pas confirmée.

    Utilisez ceci lors de la sortie d'un employé afin que la sauvegarde finale soit vérifiée avant que le siège M365/GWS ne soit libéré – ne perdez jamais les données d'un partant.

    afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "depart d'un employé"
    

Référence des commandes

applications – Gérer les applications

  • afi-cli applications – Liste les installations pour l'application identifiée par la clé d'authentification.

orgs – Gérer les organisations

  • afi-cli orgs create – Crée une nouvelle organisation enfant.
  • afi-cli orgs get – Récupère une organisation par son identifiant.

tenants – Gérer les locataires

  • afi-cli tenants <id> – Récupère un locataire par son identifiant.

Trouver la bonne commande

Lorsque vous savez ce que vous voulez faire mais pas quelle commande le fait, interrogez directement le CLI :

  afi-cli which "<capacité en vos propres mots>"

which résout une requête de capacité en langage naturel vers la commande la mieux correspondante de l'index de fonctionnalités organisé de ce CLI. Le code de sortie 0 signifie au moins une correspondance ; le code de sortie 2 signifie aucune correspondance fiable – revenez à --help ou utilisez une requête plus précise.

Recettes

Balayage du lundi

  afi-cli fleet-sync --skip-archives && afi-cli fleet-health --failed-only --agent

Rafraîchissez le magasin du parc (en sautant la lourde marche des archives), puis listez uniquement les locataires avec des tâches échouées ou des dépassements de quota.

Trouver les angles morts de sauvegarde dans un locataire

  afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent --select items.name,items.kind,items.external_id

LEFT JOIN des ressources contre les protections, réduit aux trois champs dont un agent a besoin pour ouvrir des tickets.

Sortir en toute sécurité un employé parti

  afi-cli resolve [email protected] && afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "depart d'un employé" --dry-run

Résolvez l'e-mail ambigu en la ressource Afi canonique, puis prévisualisez la séquence protégée de sauvegarde finale - vérification - suppression avant de l'exécuter pour de vrai.

Détecter les sauvegardes qui échouent silencieusement

  afi-cli backup-stale --max-age 48h --json

Ressources protégées dont l'archive la plus récente date de plus de deux jours – la classe d'échec qu'aucun écran de portail ne met en évidence.

Vérification de la dérive des licences

  afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json

Quantités d'abonnements achetés par rapport aux nombres de ressources réellement protégées, par locataire.

Configuration de l'authentification

Créez une application et une clé API dans le portail Afi (niveau organisation : Configuration → Applications ; niveau locataire : Service → Paramètres → Applications), puis définissez AFI_API_KEY. La clé est envoyée comme valeur brute de l'en-tête Authorization (les clés Afi ressemblent à appkey-... ; pas de préfixe Bearer). Chaque application prend en charge deux clés pour la rotation. Les clés héritent du périmètre d'installation de l'application – si un locataire ou une organisation manque dans les résultats, vérifiez où l'application est installée.

Exécutez afi-cli doctor pour vérifier la configuration.

Mode agent

Ajoutez --agent à n'importe quelle commande. Se développe en : --json --compact --no-input --no-color --yes.

  • Canalisable – JSON sur stdout, erreurs sur stderr

  • Filtrable – --select conserve un sous-ensemble de champs. Les chemins pointés descendent dans les structures imbriquées ; les tableaux sont parcourus élément par élément. Essentiel pour garder un contexte réduit sur les API verbeuses :

    afi-cli orgs get <org-id> --agent --select id,name,status
    
  • Prévisualisable – --dry-run affiche la requête sans l'envoyer

  • Hors ligne – les commandes de synchronisation/recherche peuvent utiliser le magasin SQLite local lorsqu'il est disponible

  • Non interactif – jamais de demande, chaque entrée est un drapeau

  • Nouvelles tentatives explicites – utilisez --idempotent uniquement lorsqu'une création déjà existante doit être considérée comme un succès, et --ignore-missing uniquement lorsqu'une cible de suppression manquante doit être considérée comme un succès

Enveloppe de réponse

Les commandes qui lisent depuis le magasin local ou l'API encapsulent la sortie dans une enveloppe de provenance :

{
  "meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
  "results": <données>
}

Analysez .results pour les données et .meta.source pour savoir si elles sont en direct ou locales. Un résumé lisible par l'homme N résultats (live) est affiché sur stderr uniquement lorsque stdout est un terminal ET qu'aucun indicateur de format machine (--json, --csv, --compact, --quiet, --plain, --select) n'est défini – les consommateurs canalisés/agents et les exécutions avec format explicite reçoivent du JSON pur sur stdout.

Retour d'information sur l'agent

Lorsque vous (ou l'agent) remarquez quelque chose d'anormal avec ce CLI, enregistrez-le :

afi-cli feedback "le drapeau --since est inclusif mais la documentation dit exclusif"
afi-cli feedback --stdin < notes.txt
afi-cli feedback list --json --limit 10

Les entrées sont stockées localement dans ~/.local/share/afi-cli/feedback.jsonl. Elles ne sont jamais envoyées par POST sauf si AFI_FEEDBACK_ENDPOINT est défini ET que soit --send est passé, soit AFI_FEEDBACK_AUTO_SEND=true. Le comportement par défaut est local uniquement.

Écrivez ce qui vous a surpris, pas un rapport de bogue. Court, spécifique, une ligne : c'est la partie qui s'accumule.

Livraison de la sortie

Chaque commande accepte --deliver <destination>. La sortie est envoyée vers la destination nommée en plus (ou à la place) de stdout, permettant aux agents d'acheminer les résultats des commandes sans avoir à canaliser manuellement. Trois destinations sont prises en charge :

DestinationEffet
stdoutPar défaut ; écriture sur stdout uniquement
file:<chemin>Écrit atomiquement la sortie vers <chemin> (tmp + renommage)
webhook:<url>Envoie le corps de la sortie en POST vers l'URL (application/json ou application/x-ndjson avec --compact)

Les schémas inconnus sont refusés avec une erreur structurée nommant l'ensemble pris en charge. Les échecs de webhook renvoient un code non nul et enregistrent l'URL + le statut HTTP sur stderr.

Profils nommés

Un profil est un ensemble enregistré de valeurs de drapeaux, réutilisées entre les invocations. Utilisez-le lorsqu'un agent planifié appelle la même commande à chaque exécution avec la même configuration.

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

Les drapeaux explicites l'emportent toujours sur les valeurs du profil ; les valeurs du profil l'emportent sur les valeurs par défaut. agent-context liste tous les profils disponibles sous available_profiles afin que les agents d'introspection les découvrent à l'exécution.

Codes de sortie

CodeSignification
0Succès
2Erreur d'utilisation (mauvais arguments)
3Ressource non trouvée
4Authentification requise
5Erreur API (problème amont)
7Limitation de débit (attendre et réessayer)
10Erreur de configuration

Analyse des arguments

Analysez $ARGUMENTS :

  1. Vide, help ou --help → afficher la sortie de afi-cli --help
  2. Commence par install → se termine par mcp → installation MCP ; sinon → voir les Prérequis ci-dessus
  3. Tout autre chose → Utilisation directe (exécuter comme commande CLI avec --agent)

Installation du serveur MCP

  1. Installez le binaire MCP (exécutez le script d'installation de la section Prérequis, ou consultez mcp-install.md pour le câblage par agent).
  2. Enregistrez avec Claude Code :
    claude mcp add afi-mcp -- afi-mcp
    
  3. Vérifiez : claude mcp list

Utilisation directe

  1. Vérifiez si installé : which afi-cli Si non trouvé, proposez d'installer (voir les Prérequis en haut de ce skill).
  2. Faites correspondre la requête de l'utilisateur à la meilleure commande parmi les Capacités uniques et la Référence des commandes ci-dessus.
  3. Exécutez avec le drapeau --agent :
    afi-cli <commande> [sous-commande] [args] --agent
    
  4. En cas d'ambiguïté, explorez l'aide de la sous-commande : afi-cli <commande> --help.

Individual skills in this repo

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

Skills associés