Afi – Claude-Code-Skill
Voraussetzungen: CLI installieren
Dieses Skill steuert die afi-cli-Binärdatei. Du musst überprüfen, ob die CLI installiert ist, bevor du einen Befehl aus diesem Skill ausführst. Falls sie fehlt, installiere sie zuerst:
- 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 - Überprüfung:
afi-cli --version - Stelle sicher, dass
~/.local/bin(macOS / Linux) oder%LOCALAPPDATA%\Programs\msp-skills(Windows) im$PATHenthalten ist.
Das Installationsprogramm lädt die Binärdateien afi-cli und afi-mcp in ~/.local/bin (macOS / Linux) bzw. %LOCALAPPDATA%\Programs\msp-skills (Windows) herunter. Es registriert das Skill nicht bei deinem Agenten und schreibt keine MCP-Client-Konfiguration – siehe mcp-install.md für den Anschluss.
Wenn nach der Installation bei --version „command not found“ gemeldet wird, kann die Laufzeitumgebung das Binärverzeichnis nicht im $PATH finden. Fahre erst mit den Skill-Befehlen fort, wenn die Überprüfung erfolgreich war.
Eine quelloffene CLI und ein MCP-Server für Afi, dessen Anbieter API-Polling explizit ablehnt. Diese CLI durchläuft die gesamte Hierarchie einmalig in eine lokale SQLite-Datenbank (fleet-sync) und beantwortet dann flottenweite Fragen (Coverage-Lücken, Flottengesundheit, Backup-Veralterung, Lizenzabgleich) offline. Ein bewachter Offboard-Befehl führt die eigene Archivierungs- und Freigabesequenz des Anbieters mit einer Verifikationsstufe aus, die das Portal nicht bietet.
Wann diese CLI verwenden?
Verwende diese CLI für jede programmatische Frage zu Afi-SaaS-Backup-Flotten: Backup-Abdeckung, nächtliche Aufgabengesundheit, Kontingentverletzungen, Archivveralterung, Lizenzabgleich und die bewachte Archivierungs- und Offboarding-Sequenz für ausscheidende Mitarbeiter. Sie ist die richtige Wahl für Fragen auf MSP-Ebene über viele Mandanten hinweg, bei denen das Portal einen mandantenweisen Durchlauf erzwingt und die ratenbegrenzte API Polling bestraft – einmal synchronisieren, dann die lokale Speicherung abfragen.
Anti-Trigger
Diese CLI nicht für Folgendes verwenden:
- Durchführen von Wiederherstellungen, Exporten oder Durchsuchen tatsächlicher Backup-Daten – die öffentliche Afi-API stellt keine Initiation von Wiederherstellungen/Exporten oder Daten-Downloads zur Verfügung; verwende das Afi-Webportal
- Erstellen oder Bearbeiten von Backup-Richtlinien – Richtlinien sind in der öffentlichen API schreibgeschützt; konfiguriere sie im Portal
- Echtzeitüberwachung oder kontinuierliches Polling des Aufgabenstatus – Afi drosselt explizit und kann Polling-Anwendungen sperren; verwende stattdessen geplante Synchronisierungen
- Verwalten von Afi-Portal-Benutzerkonten, SSO oder Benachrichtigungseinstellungen – nicht Teil der öffentlichen API-Oberfläche
Einzigartige Fähigkeiten
Diese Fähigkeiten sind in keinem anderen Tool für diese API verfügbar.
Lokaler Zustand, der sich auszahlt
-
fleet-sync– Durchlaufe die gesamte Afi-Hierarchie – Installationen, Organisationen, Mandanten, dann die Ressourcen, Schutzmaßnahmen, Richtlinien, Archive, Kontingente und Aufgabenstatistiken jedes Mandanten – in einer respektvollen Runde in die lokale SQLite-Datenbank.Führe dies zuerst aus (und plane es regelmäßig ein): Jede folgende Flottenfrage – Abdeckung, Veralterung, Lizenzierung, Scorecards – wird offline beantwortet, ohne die Afi-Ratenbegrenzungen auszulösen.
afi-cli fleet-sync -
coverage-gaps– Finde Ressourcen in einem Mandanten, auf die kein Backup-Schutz angewendet wird – die Backup-Blindstellen.Greife darauf zurück, wenn gefragt wird, ob jede Mailbox, Site oder jedes Laufwerk tatsächlich gesichert wird – es beantwortet Abdeckungsfragen für die gesamte Flotte, die eine API nicht kann.
afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent -
fleet-health– Eine Tabelle über alle synchronisierten Mandanten hinweg: Anzahl erfolgreicher/fehlgeschlagener Aufgaben, Liste fehlgeschlagener Aufgaben und Kontingentverletzungen.Verwende dies für die montägliche „Ist die ganze Flotte grün?“-Überprüfung, anstatt Mandanten einen Portal-Tab nach dem anderen zu durchzugehen.
afi-cli fleet-health --since 24h --agent -
resolve– Ordne eine Microsoft 365 / Google Workspace-ID, E-Mail oder einen Namen der kanonischen Afi-Ressource oder dem Mandanten zu, einschließlich Multi-Geo-Fan-Out.Führe dies vor jedem Offboarding oder Audit durch, um sicherzustellen, welches Afi-Objekt einer externen Systemidentität entspricht.
afi-cli resolve [email protected] --agent -
reconcile-licenses– Vergleiche gekaufte Abonnementmengen mit den tatsächlich geschützten Ressourcenanzahlen pro Mandant, um Über- und Unterversorgung zu kennzeichnen.Verwende dies für die wöchentliche Lizenzdriftprüfung, die heute manuelle Tabellenkalkulation über zwei Portalbildschirme erfordert.
afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json -
backup-stale– Markiere geschützte Ressourcen, deren neuestes Backup-Archiv älter als ein Schwellenwert ist – geschützt, aber stillschweigend fehlschlagende Ressourcen.Verwende dies, um die Klasse der stillen Fehler zu erkennen: Ressourcen, die eine Richtlinie zugewiesen haben, deren Backups aber leise eingestellt wurden.
afi-cli backup-stale --max-age 48h --agent -
tenant-scorecard– Die vollständige Backup-Postur eines Mandanten: Abdeckungsprozentsatz, letzter Aufgabenstatus, Alter des neuesten/ältesten Archivs und Kontingentstatus.Erstelle diese Karte bei der Vorbereitung eines Kunden-Tickets oder eines QBR – der tiefgehende Einblick pro Mandant, der fleet-health ergänzt.
afi-cli tenant-scorecard 01F000000000000411Z1101G1Y --agent --select tenant_id,coverage_pct,quotas_exceeded
Bewachte Workflows
-
offboard– Sichere die Ressource eines ausscheidenden Benutzers, überprüfe, ob das Archiv gelandet ist, und hebe dann den Schutz auf – verweigere den irreversiblen Schritt, bis das Backup bestätigt ist.Verwende dies beim Offboarding eines Mitarbeiters, damit die letzte Sicherung verifiziert wird, bevor der M365/GWS-Sitz freigegeben wird – verliere niemals die Daten eines Ausscheidenden.
afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "Mitarbeiter-Austritt"
Befehlsreferenz
applications – Anwendungen verwalten
afi-cli applications– Listet Installationen für die durch den Authentifizierungsschlüssel identifizierte Anwendung auf.
orgs – Organisationen verwalten
afi-cli orgs create– Erstellt eine neue untergeordnete Organisation.afi-cli orgs get– Ruft eine Organisation anhand ihrer ID ab.
tenants – Mandanten verwalten
afi-cli tenants <id>– Ruft einen Mandanten anhand seiner ID ab.
Den richtigen Befehl finden
Wenn du weißt, was du tun möchtest, aber nicht, welcher Befehl es tut, frage die CLI direkt:
fi-cli which "<Fähigkeit in eigenen Worten>"
which löst eine natürlichsprachliche Fähigkeitsabfrage in den am besten passenden Befehl aus dem kuratierten Feature-Index dieser CLI auf. Exit-Code 0 bedeutet mindestens eine Übereinstimmung; Exit-Code 2 bedeutet keine sichere Übereinstimmung – falle auf --help zurück oder verwende eine engere Abfrage.
Rezepte
Montägliche Flottenüberprüfung
fi-cli fleet-sync --skip-archives && afi-cli fleet-health --failed-only --agent
Aktualisiere den Flottenspeicher (überspringe den schweren Archivdurchlauf) und liste dann nur die Mandanten mit fehlgeschlagenen Aufgaben oder Kontingentverletzungen auf.
Backup-Blindstellen in einem Mandanten finden
fi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent --select items.name,items.kind,items.external_id
LEFT JOIN von Ressourcen gegen Schutzmaßnahmen, eingeschränkt auf die drei Felder, die ein Agent für die Ticket-Erstellung benötigt.
Einen ausgeschiedenen Mitarbeiter sicher offboarden
fi-cli resolve [email protected] && afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "Mitarbeiter-Austritt" --dry-run
Löse die mehrdeutige E-Mail in die kanonische Afi-Ressource auf und zeige dann die bewachte Sequenz aus letzter Sicherung, Überprüfung und Freigabe in der Vorschau an, bevor du sie tatsächlich ausführst.
Stillschweigend fehlschlagende Backups erkennen
fi-cli backup-stale --max-age 48h --json
Geschützte Ressourcen, deren neuestes Archiv älter als zwei Tage ist – die Fehlerklasse, die kein Portalbildschirm anzeigt.
Lizenzdriftprüfung
fi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json
Gekaufte Abonnementmengen im Vergleich zu den tatsächlich geschützten Ressourcenanzahlen, pro Mandant.
Authentifizierungseinrichtung
Erstelle eine Anwendung und einen API-Schlüssel im Afi-Portal (Organisationsebene: Konfiguration → Apps; Mandantenebene: Dienst → Einstellungen → Apps) und setze dann AFI_API_KEY. Der Schlüssel wird als roher Authorization-Header-Wert gesendet (Afi-Schlüssel sehen aus wie appkey-...; kein Bearer-Präfix). Jede Anwendung unterstützt zwei Schlüssel zur Rotation. Schlüssel erben den Installationsbereich der Anwendung – wenn ein Mandant oder eine Organisation in den Ergebnissen fehlt, überprüfe, wo die Anwendung installiert ist.
Führe afi-cli doctor aus, um die Einrichtung zu überprüfen.
Agentenmodus
Füge --agent an jeden Befehl an. Erweitert sich zu: --json --compact --no-input --no-color --yes.
-
Pipeline-fähig – JSON auf stdout, Fehler auf stderr
-
Filterbar –
--selectbehält eine Teilmenge der Felder. Punktierte Pfade tauchen in verschachtelte Strukturen ein; Arrays werden elementweise durchlaufen. Entscheidend, um den Kontext bei ausführlichen APIs klein zu halten:afi-cli orgs get <org-id> --agent --select id,name,status -
Vorschau-fähig –
--dry-runzeigt die Anfrage an, ohne sie zu senden -
Offline-freundlich – Sync-/Suchbefehle können bei Verfügbarkeit den lokalen SQLite-Speicher verwenden
-
Nicht interaktiv – fordert nie zur Eingabe auf, jede Eingabe ist ein Flag
-
Explizite Wiederholungen – verwende
--idempotentnur, wenn ein bereits existierender Create als Erfolg zählen soll, und--ignore-missingnur, wenn ein fehlendes Delete-Ziel als Erfolg zählen soll
Antwortumschlag
Befehle, die aus dem lokalen Speicher oder der API lesen, verpacken die Ausgabe in einen Provenienz-Umschlag:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <daten>
}
Parse .results für Daten und .meta.source, um zu wissen, ob es live oder lokal ist. Eine menschenlesbare Zusammenfassung N Ergebnisse (live) wird nur dann auf stderr ausgegeben, wenn stdout ein Terminal IST UND kein maschinenlesbares Format-Flag (--json, --csv, --compact, --quiet, --plain, --select) gesetzt ist – Pipeline-/Agent-Konsumenten und explizite Formatausführungen erhalten reines JSON auf stdout.
Agenten-Feedback
Wenn dir (oder dem Agenten) etwas an dieser CLI auffällt, zeichne es auf:
fi-cli feedback "das --since-Flag ist inklusiv, aber die Dokumentation sagt exklusiv"
afi-cli feedback --stdin < notizen.txt
afi-cli feedback list --json --limit 10
Einträge werden lokal unter ~/.local/share/afi-cli/feedback.jsonl gespeichert. Sie werden niemals per POST gesendet, es sei denn, AFI_FEEDBACK_ENDPOINT ist gesetzt UND entweder --send wird übergeben oder AFI_FEEDBACK_AUTO_SEND=true. Das Standardverhalten ist nur lokal.
Schreibe, was dich überrascht hat, keinen Fehlerbericht. Kurz, spezifisch, eine Zeile: Das ist der Teil, der sich auszahlt.
Ausgabe-Zustellung
Jeder Befehl akzeptiert --deliver <senke>. Die Ausgabe wird zusätzlich zur (oder anstelle der) Standardausgabe an die benannte Senke gesendet, sodass Agenten Befehlsergebnisse ohne manuelle Pipes weiterleiten können. Drei Senken werden unterstützt:
| Senke | Wirkung |
|---|---|
stdout | Standard; nur auf stdout schreiben |
file:<pfad> | Ausgabe atomar in <pfad> schreiben (tmp + umbenennen) |
webhook:<url> | Ausgabetext per POST an die URL senden (application/json oder application/x-ndjson bei --compact) |
Unbekannte Schemata werden mit einem strukturierten Fehler abgelehnt, der die unterstützte Menge benennt. Webhook-Fehler geben einen Nicht-Null-Wert zurück und protokollieren die URL + HTTP-Status auf stderr.
Benannte Profile
Ein Profil ist eine gespeicherte Menge von Flag-Werten, die über Aufrufe hinweg wiederverwendet werden. Verwende es, wenn ein geplanter Agent denselben Befehl bei jeder Ausführung mit derselben Konfiguration aufruft.
fi-cli profile save briefing --json
cli --profile briefing orgs get <org-id>
afi-cli profile list --json
afi-cli profile show briefing
afi-cli profile delete briefing --yes
Explizite Flags gewinnen immer gegen Profilwerte; Profilwerte gewinnen gegen Standardwerte. agent-context listet alle verfügbaren Profile unter available_profiles auf, damit introspektierende Agenten sie zur Laufzeit entdecken.
Exit-Codes
| Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| 2 | Verwendungsfehler (falsche Argumente) |
| 3 | Ressource nicht gefunden |
| 4 | Authentifizierung erforderlich |
| 5 | API-Fehler (Problem mit dem Upstream) |
| 7 | Ratenbegrenzung erreicht (warten und wiederholen) |
| 10 | Konfigurationsfehler |
Argumentanalyse
Analysiere $ARGUMENTS:
- Leer,
helpoder--help→ zeigeafi-cli --help-Ausgabe - Beginnt mit
install→ endet mitmcp→ MCP-Installation; andernfalls → siehe Voraussetzungen oben - Alles andere → Direkte Verwendung (als CLI-Befehl mit
--agentausführen)
MCP-Server-Installation
- Installiere die MCP-Binärdatei (führe das Installationsskript aus dem Abschnitt „Voraussetzungen“ aus oder siehe mcp-install.md für den agentenspezifischen Anschluss).
- Registriere bei Claude Code:
claude mcp add afi-mcp -- afi-mcp - Überprüfen:
claude mcp list
Direkte Verwendung
- Prüfen, ob installiert:
which afi-cliFalls nicht gefunden, Angebot zur Installation (siehe Voraussetzungen oben in diesem Skill). - Ordne die Benutzeranfrage dem besten Befehl aus den einzigartigen Fähigkeiten und der Befehlsreferenz oben zu.
- Führe mit dem
--agent-Flag aus:afi-cli <befehl> [unterbefehl] [argumente] --agent - Bei Mehrdeutigkeit in die Unterbefehlshilfe eintauchen:
afi-cli <befehl> --help.