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 :
- 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 - Vérifier :
afi-cli --version - 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 –
--selectconserve 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-runaffiche 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
--idempotentuniquement lorsqu'une création déjà existante doit être considérée comme un succès, et--ignore-missinguniquement 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 :
| Destination | Effet |
|---|---|
stdout | Par 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
| Code | Signification |
|---|---|
| 0 | Succès |
| 2 | Erreur d'utilisation (mauvais arguments) |
| 3 | Ressource non trouvée |
| 4 | Authentification requise |
| 5 | Erreur API (problème amont) |
| 7 | Limitation de débit (attendre et réessayer) |
| 10 | Erreur de configuration |
Analyse des arguments
Analysez $ARGUMENTS :
- Vide,
helpou--help→ afficher la sortie deafi-cli --help - Commence par
install→ se termine parmcp→ installation MCP ; sinon → voir les Prérequis ci-dessus - Tout autre chose → Utilisation directe (exécuter comme commande CLI avec
--agent)
Installation du serveur MCP
- 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).
- Enregistrez avec Claude Code :
claude mcp add afi-mcp -- afi-mcp - Vérifiez :
claude mcp list
Utilisation directe
- Vérifiez si installé :
which afi-cliSi non trouvé, proposez d'installer (voir les Prérequis en haut de ce skill). - 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.
- Exécutez avec le drapeau
--agent:afi-cli <commande> [sous-commande] [args] --agent - En cas d'ambiguïté, explorez l'aide de la sous-commande :
afi-cli <commande> --help.