CommunityCodierung & Entwicklunggithub.com

Servosity/afi

Die erste CLI für Afi SaaS-Backups – vollständige Abdeckung der öffentlichen API sowie flottenweite Coverage-, Veralterungs- und Offboarding-Antworten, die die ratenbegrenzte API live nicht liefern kann. Auslöse-Phrasen: `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`.

Was ist afi?

Dieses Skill bindet die `afi-cli` ein – eine quelloffene CLI und ein MCP-Server für Afi SaaS-Backup-Flotten. Es adressiert das zentrale Problem, dass die Afi-API Polling aktiv unterbindet und stark ratenbegrenzt ist. Die CLI synchronisiert einmalig die gesamte Afi-Hierarchie (Installationen, Organisationen, Mandanten, Ressourcen sowie deren Schutzstatus, Richtlinien, Archive, Kontingente und Aufgabenstatistiken) in eine lokale SQLite-Datenbank (Befehl: `fleet-sync`). Anschließend können flottenweite Abfragen wie Coverage-Lücken (`coverage-gaps`), Aufgabengesundheit (`fleet-health`), Veralterung von Backups (`backup-stale`) oder Lizenzabgleiche (`reconcile-licenses`) vollständig offline und ohne weitere API-Aufrufe beantwortet werden. Ein besonderes Feature ist der bewachte Offboarding-Workflow (`offboard`), der die letzte Sicherung archiviert, verifiziert und erst dann die Schutzfreigabe aufhebt – eine Schrittfolge, die das Afi-Portal nicht bietet. Die CLI unterstützt eine strukturierte Agentenmodus (`--agent`), liefert JSON-Antworten mit Provenienz-Metadaten (live vs. lokal) und erlaubt die Zustellung der Ergebnisse an Dateien oder über Webhooks (`--deliver`). Das Skill ist für Claude Code, Cursor und Codex optimiert und wird über Auslösephrasen wie „check afi backup coverage“ oder „afi fleet health“ aktiviert.

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

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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:

  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. Überprüfung: afi-cli --version
  4. Stelle sicher, dass ~/.local/bin (macOS / Linux) oder %LOCALAPPDATA%\Programs\msp-skills (Windows) im $PATH enthalten 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 – --select behä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-run zeigt 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 --idempotent nur, wenn ein bereits existierender Create als Erfolg zählen soll, und --ignore-missing nur, 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:

SenkeWirkung
stdoutStandard; 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

CodeBedeutung
0Erfolg
2Verwendungsfehler (falsche Argumente)
3Ressource nicht gefunden
4Authentifizierung erforderlich
5API-Fehler (Problem mit dem Upstream)
7Ratenbegrenzung erreicht (warten und wiederholen)
10Konfigurationsfehler

Argumentanalyse

Analysiere $ARGUMENTS:

  1. Leer, help oder --help → zeige afi-cli --help-Ausgabe
  2. Beginnt mit install → endet mit mcp → MCP-Installation; andernfalls → siehe Voraussetzungen oben
  3. Alles andere → Direkte Verwendung (als CLI-Befehl mit --agent ausführen)

MCP-Server-Installation

  1. Installiere die MCP-Binärdatei (führe das Installationsskript aus dem Abschnitt „Voraussetzungen“ aus oder siehe mcp-install.md für den agentenspezifischen Anschluss).
  2. Registriere bei Claude Code:
    claude mcp add afi-mcp -- afi-mcp
    
  3. Überprüfen: claude mcp list

Direkte Verwendung

  1. Prüfen, ob installiert: which afi-cli Falls nicht gefunden, Angebot zur Installation (siehe Voraussetzungen oben in diesem Skill).
  2. Ordne die Benutzeranfrage dem besten Befehl aus den einzigartigen Fähigkeiten und der Befehlsreferenz oben zu.
  3. Führe mit dem --agent-Flag aus:
    afi-cli <befehl> [unterbefehl] [argumente] --agent
    
  4. Bei Mehrdeutigkeit in die Unterbefehlshilfe eintauchen: afi-cli <befehl> --help.

Individual skills in this repo

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

Verwandte Skills