Communityコーディング&開発github.com

Servosity/afi

Afi SaaSバックアップ向けの初のCLI。公開APIを完全カバーし、レート制限のあるAPIではライブ提供できないフリート全体のカバレッジ、古さ、オフボーディングに対応します。トリガーフレーズ:`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`。

afi とは?

Servosity/afiスキルは、Afi SaaSバックアッププラットフォーム用のCLIツール`afi-cli`を駆動するClaude Codeスキルです。このCLIは、Afiの公開APIが推奨しないポーリングを避けるために設計されており、一度フリート全体の階層をローカルSQLiteに同期(fleet-sync)した後、カバレッジギャップ、フリートヘルス、バックアップの古さ、ライセンス調整などのフリート全体の質問にオフラインで回答します。また、ガード付きのオフボードコマンドは、ポータルでは欠けている検証ステップを含むアーカイブ→リリースのシーケンスを実行します。このスキルは、複数のテナントにまたがるMSP規模の質問に最適であり、テナントごとのポータル操作やレート制限のあるAPIポーリングを回避できます。Claude Code、Cursor、CodexなどのAIエージェントと連携し、`--agent`フラグを使用することでJSON出力、非対話モード、パイプ可能な出力を実現します。

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

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Afi - Claude Code スキル

前提条件: CLIのインストール

このスキルはafi-cliバイナリを駆動します。このスキルのコマンドを呼び出す前に、CLIがインストールされていることを確認する必要があります。 ない場合は、最初にインストールしてください:

  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. 確認: afi-cli --version
  4. ~/.local/bin (macOS / Linux) または %LOCALAPPDATA%\Programs\msp-skills (Windows) が$PATHに含まれていることを確認してください。

インストーラーはafi-cliとafi-mcpバイナリを~/.local/bin (macOS / Linux) または%LOCALAPPDATA%\Programs\msp-skills (Windows) にダウンロードします。エージェントへのスキル登録は行わず、MCPクライアント設定も書き込みません。その設定についてはmcp-install.mdを参照してください。

インストール後に--versionが「command not found」を報告する場合、ランタイムが$PATH上のバイナリディレクトリを認識できていません。確認が成功するまでスキルコマンドを進めないでください。

Afi向けのオープンソースCLIおよびMCPサーバーです。ベンダーは明示的にAPIポーリングを推奨していません。このCLIは、階層全体を一度ローカルSQLiteにウォーク(fleet-sync)し、フリート全体の質問(カバレッジギャップ、フリートヘルス、バックアップの古さ、ライセンス調整)にオフラインで回答します。ガード付きのオフボードコマンドは、ポータルにはない検証ゲートを備えたベンダーのアーカイブ→リリースシーケンスを実行します。

このCLIを使用するタイミング

Afi SaaSバックアップフリートに関するプログラムによる質問には、このCLIを使用してください: バックアップカバレッジ、夜間タスクの健全性、クォータ違反、アーカイブの古さ、ライセンス調整、退職者のガード付きアーカイブ&オフボードシーケンス。これは、ポータルがテナントごとのウォークを強制し、レート制限のあるAPIがポーリングを罰するMSP規模の質問に最適な選択肢です — 一度同期してからローカルストアをクエリします。

アンチトリガー

このCLIを以下の目的で使用しないでください:

  • リストア、エクスポート、実際のバックアップデータの閲覧 — Afi公開APIはリストア/エクスポートの開始やデータダウンロードを公開していません。Afiウェブポータルを使用してください。
  • バックアップポリシーの作成または編集 — ポリシーは公開APIでは読み取り専用です。ポータルで設定してください。
  • タスクステータスのリアルタイム監視または継続的ポーリング — Afiは明示的にスロットルをかけ、ポーリングアプリケーションを停止する可能性があります。代わりにスケジュールされた同期を使用してください。
  • Afiポータルのユーザーアカウント、SSO、通知設定の管理 — 公開APIの対象外です。

ユニークな機能

これらの機能は、このAPI用の他のツールでは利用できません。

蓄積されるローカル状態

  • fleet-sync — Afi階層全体(インストール、組織、テナント、各テナントのリソース、保護、ポリシー、アーカイブ、クォータ、タスク統計)を一度の丁寧なパスでローカルSQLiteにウォークします。

    最初に(そしてスケジュールで)これを実行してください: 以降のすべてのフリート質問(カバレッジ、古さ、ライセンス、スコアカード)は、Afiのレート制限に引っかからずにオフラインで回答します。

    afi-cli fleet-sync
    
  • coverage-gaps — テナント内でバックアップ保護が適用されていないリソースを見つけます — バックアップの盲点です。

    すべてのメールボックス、サイト、ドライブが実際にバックアップされているかどうかを尋ねられたときに使用します — APIだけでは答えられないフリートカバレッジの質問に答えます。

    afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent
    
  • fleet-health — 同期されたすべてのテナントにわたる1つのテーブル: タスクの成功/失敗数、失敗タスクリスト、クォータ違反。

    月曜朝の「フリート全体は正常か」のチェックに、ポータルタブをテナントごとにウォークする代わりにこれを使用してください。

    afi-cli fleet-health --since 24h --agent
    
  • resolve — Microsoft 365 / Google Workspace ID、メールアドレス、名前を正規のAfiリソースまたはテナントにマッピングします(Multi-Geoファンアウトを含む)。

    オフボードや監査の前にこれを実行して、どのAfiオブジェクトが外部システムのIDに対応するかを確実にしてください。

    afi-cli resolve [email protected] --agent
    
  • reconcile-licenses — 購入したサブスクリプション数量とテナントごとに実際に保護されているリソース数を比較し、過剰プロビジョニングと過小プロビジョニングをフラグします。

    週次のライセンスドリフトチェックに使用します。現在は2つのポータル画面にまたがる手動のスプレッドシート結合が必要です。

    afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json
    
  • backup-stale — 最新のバックアップアーカイブがしきい値よりも古い保護済みリソースをフラグします — 保護されているが、静かに失敗しているリソースです。

    静かな失敗クラスをキャッチするために使用します: ポリシーがアタッチされているが、バックアップが静かに停止しているリソース。

    afi-cli backup-stale --max-age 48h --agent
    
  • tenant-scorecard — 1つのテナントの完全なバックアップ態勢: カバレッジ率、最新のタスクステータス、最新/最古のアーカイブ経過時間、クォータ状態。

    カスタマーチケットやQBRの準備時にこのカードを生成します — fleet-healthを補完するテナントごとの詳細分析です。

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

ガード付きワークフロー

  • offboard — 退職ユーザーのリソースを安全にバックアップし、アーカイブが正常に配置されたことを確認してから保護を解除します — バックアップが確認されるまで不可逆的なステップを拒否します。

    従業員のオフボード時にこれを使用すると、M365/GWSシートが解放される前に最終バックアップが確認され、退職者のデータを決して失いません。

    afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "employee departure"
    

コマンドリファレンス

applications — アプリケーションを管理

  • afi-cli applications — 認証キーで識別されるアプリケーションのインストールを一覧表示します。

orgs — 組織を管理

  • afi-cli orgs create — 新しい子組織を作成します。
  • afi-cli orgs get — IDで組織を取得します。

tenants — テナントを管理

  • afi-cli tenants <id> — IDでテナントを取得します。

適切なコマンドを見つける

何をしたいかはわかっているが、どのコマンドを使うかわからない場合は、CLIに直接問い合わせてください:

afi-cli which "<あなたの言葉での機能>"

whichは、自然言語の機能クエリを、このCLIの厳選された機能インデックスから最も一致するコマンドに解決します。終了コード0は少なくとも1つの一致があることを意味し、終了コード2は確実な一致がないことを意味します — --helpにフォールバックするか、より狭いクエリを使用してください。

レシピ

月曜日のフリート一斉チェック

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

フリートストアを更新し(重いアーカイブウォークはスキップ)、失敗したタスクやクォータ違反があるテナントのみを一覧表示します。

1つのテナントのバックアップ盲点を見つける

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

リソースと保護のLEFT JOINを、エージェントがチケットを開くために必要な3つのフィールドに絞り込みます。

退職した従業員を安全にオフボードする

abi-cli resolve [email protected] && afi-cli offboard 01F0RESOURCE0000000000000A --tenant 01F0TENANT00000000000000B --policy 01F0POLICY000000000000000C --reason "employee departure" --dry-run

あいまいなメールアドレスを正規のAfiリソースに解決し、実際に実行する前にガード付きの最終バックアップ確認・リリースシーケンスをプレビューします。

静かに失敗しているバックアップをキャッチする

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

最新のアーカイブが2日以上前の保護済みリソース — ポータル画面では表面化しない障害クラスです。

ライセンスドリフトチェック

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

購入したサブスクリプション数量と実際に保護されているリソース数をテナントごとに比較します。

認証設定

AfiポータルでアプリケーションとAPIキーを作成し(組織レベル: 設定 → アプリ; テナントレベル: サービス → 設定 → アプリ)、AFI_API_KEYを設定します。キーは生のAuthorizationヘッダー値として送信されます(Afiキーはappkey-...のようになります。Bearerプレフィックスは不要です)。各アプリケーションはローテーション用に2つのキーをサポートしています。キーはアプリケーションのインストールスコープを継承します — 結果にテナントや組織がない場合は、アプリケーションがどこにインストールされているかを確認してください。

afi-cli doctorを実行して設定を確認します。

エージェントモード

任意のコマンドに--agentを追加します。以下に展開されます: --json --compact --no-input --no-color --yes

  • パイプ可能 — JSONはstdoutに、エラーはstderrに

  • フィルタ可能 — --selectでフィールドのサブセットを保持します。ドット付きパスはネスト構造を下降し、配列は要素ごとにトラバースします。詳細なAPIでコンテキストを小さく保つために重要です:

    afi-cli orgs get <org-id> --agent --select id,name,status
    
  • プレビュー可能 — --dry-runでリクエストを送信せずに表示

  • オフラインフレンドリー — 同期/検索コマンドは、利用可能な場合にローカルのSQLiteストアを使用できます

  • 非対話型 — プロンプトは表示されず、すべての入力はフラグです

  • 明示的なリトライ — --idempotentは、すでに存在する作成を成功としてカウントする場合にのみ使用し、--ignore-missingは、存在しない削除ターゲットを成功としてカウントする場合にのみ使用します

レスポンスエンベロープ

ローカルストアまたはAPIから読み取るコマンドは、出力を来歴エンベロープでラップします:

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

データは.resultsを、ライブかローカルかは.meta.sourceを解析します。人間が読めるN results (live)サマリーは、stdoutが端末であり、かつ機械フォーマットフラグ(--json、--csv、--compact、--quiet、--plain、--select)が設定されていない場合にのみstderrに出力されます — パイプ/エージェントコンシューマーと明示的フォーマット実行は、純粋なJSONをstdoutに取得します。

エージェントフィードバック

このCLIに関して何かおかしいと気づいた場合(あなたまたはエージェントが)、記録してください:

afi-cli feedback "the --since flag is inclusive but docs say exclusive"
afi-cli feedback --stdin < notes.txt
afi-cli feedback list --json --limit 10

エントリはローカルに~/.local/share/afi-cli/feedback.jsonlに保存されます。AFI_FEEDBACK_ENDPOINTが設定されていて、かつ--sendが渡されるかAFI_FEEDBACK_AUTO_SEND=trueの場合を除き、POSTされることはありません。デフォルトの動作はローカルのみです。

驚いたこと を書いてください。バグ報告ではありません。短く、具体的に、1行で: それが蓄積される部分です。

出力配信

すべてのコマンドは--deliver <sink>を受け入れます。出力は、stdoutに加えて(または代わりに)指定されたシンクに送られるため、エージェントは手動でパイプしなくてもコマンド結果をルーティングできます。3つのシンクがサポートされています:

シンク効果
stdoutデフォルト。stdoutにのみ書き込みます。
file:<path>出力をアトミックに<path>に書き込みます(一時ファイル + リネーム)。
webhook:<url>出力ボディをURLにPOSTします(--compactの場合はapplication/jsonまたはapplication/x-ndjson)。

不明なスキームは、サポートされているセットを指定した構造化エラーで拒否されます。Webhookの失敗は非ゼロを返し、stderrにURL + HTTPステータスを記録します。

名前付きプロファイル

プロファイルは、保存されたフラグ値のセットで、複数の呼び出しで再利用されます。スケジュールされたエージェントが実行ごとに同じ構成で同じコマンドを呼び出す場合に使用します。

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

明示的なフラグは常にプロファイル値より優先され、プロファイル値はデフォルトより優先されます。agent-contextは、利用可能なすべてのプロファイルをavailable_profilesの下にリストするため、内観するエージェントは実行時にそれらを発見できます。

終了コード

コード意味
0成功
2使用法エラー(引数が間違っている)
3リソースが見つからない
4認証が必要
5APIエラー(上流の問題)
7レート制限(待ってからリトライ)
10設定エラー

引数の解析

$ARGUMENTSを解析します:

  1. 空、help、または--help → afi-cli --helpの出力を表示
  2. installで始まる → mcpで終わる場合 → MCPインストール。それ以外の場合 → 上記の前提条件を参照
  3. それ以外 → 直接使用(CLIコマンドとして--agentを付けて実行)

MCPサーバーのインストール

  1. MCPバイナリをインストールします(前提条件セクションのインストールスクリプトを実行するか、エージェントごとの結線についてはmcp-install.mdを参照)。
  2. Claude Codeに登録:
    claude mcp add afi-mcp -- afi-mcp
    
  3. 確認: claude mcp list

直接使用

  1. インストールされているか確認: which afi-cli 見つからない場合は、インストールを提案します(このスキルの上部にある前提条件を参照)。
  2. ユーザークエリを、上記のユニークな機能とコマンドリファレンスから最適なコマンドにマッチングします。
  3. --agentフラグを付けて実行:
    afi-cli <command> [subcommand] [args] --agent
    
  4. あいまいな場合は、サブコマンドのヘルプを確認: afi-cli <command> --help

Individual skills in this repo

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

関連スキル