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 是什么?

此技能封装了 `afi-cli`,这是一个专为 Afi SaaS 备份平台设计的开源命令行界面。它解决了 Afi 供应商明确不鼓励 API 轮询的关键痛点——该 CLI 通过在单次 `fleet-sync` 操作中将整个 Afi 层级结构(安装、组织、租户及每个租户的资源)同步到本地 SQLite 数据库中,从而能够在离线状态下即时回答跨多个租户的全局问题,例如备份覆盖缺口、任务健康状态、配额违规、归档陈旧性以及许可证对账。此外,它还提供了一个安全离职(offboard)流程,在执行保护解除操作之前,会先强制执行归档备份并验证归档是否成功,从而避免数据丢失。该工具通过 `--agent` 标志支持 JSON 输出,便于集成到其他自动化流程中,并提供 `--deliver` 命令用于将输出路由到文件或Webhook。它适用于 Claude Code、Cursor、Codex 以及其他支持 CLI 技能调用的 AI 代理,特别适合托管服务提供商(MSP)进行大规模、多租户的备份管理。

兼容平台✓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 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

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 报告“找不到命令”,说明运行时无法在 $PATH 中找到二进制所在目录。在验证成功之前,请勿继续执行技能命令。

一个用于 Afi 的开源 CLI 和 MCP 服务器,其供应商明确不鼓励 API 轮询。此 CLI 会将整个层级结构一次性同步到本地 SQLite 数据库中(fleet-sync),然后离线回答全局性问题(覆盖缺口、全局健康状态、备份陈旧性、许可证对账)。一个带有保护机制的离职命令会执行供应商自己的归档-然后-释放序列,并带有门户网站所缺少的验证门。

何时使用此 CLI

对于任何关于 Afi SaaS 备份集群的程序化查询,请使用此 CLI:备份覆盖率、夜间任务健康状态、配额违规、归档陈旧性、许可证对账以及为离职员工执行的安全归档与离职流程。对于跨多个租户的 MSP 规模问题,它是正确的选择,因为门户网站强制逐个租户操作,而速率受限的 API 会惩罚轮询——一次性同步,然后查询本地存储。

反触发词

请勿将此 CLI 用于:

  • 执行恢复、导出或浏览实际的备份数据——Afi 公开 API 不暴露恢复/导出启动或数据下载功能;请使用 Afi 网页门户
  • 创建或编辑备份策略——公开 API 中策略为只读;请在门户中配置
  • 实时监控或持续轮询任务状态——Afi 明确会限制并可能暂停轮询应用程序;请改用计划同步
  • 管理 Afi 门户用户账户、SSO 或通知设置——不在公开 API 范围内

独特能力

以下能力是此 API 的任何其他工具都不具备的。

可累积的本地状态

  • fleet-sync——以一次对 Afi 的尊重性遍历,将整个 Afi 层级结构(安装、组织、租户,以及每个租户的资源、保护、策略、归档、配额和任务统计)同步到本地 SQLite。

    首先运行此命令(并按计划运行):之后每个关于集群的问题——覆盖率、陈旧性、许可、记分卡——都可以在离线状态下回答,而不会触发 Afi 的速率限制。

    afi-cli fleet-sync
    
  • coverage-gaps——查找租户内未应用任何备份保护的资源——即备份盲点。

    当被问及每个邮箱、站点或驱动器是否真的已被备份时,可以使用此命令——它可以回答单个 API 无法回答的集群覆盖率问题。

    afi-cli coverage-gaps --tenant 01F000000000000411Z1101G1Y --agent
    
  • fleet-health——一个覆盖所有已同步租户的表:任务成功/失败计数、失败任务列表和配额违规。

    使用此命令进行“周一早上整个集群是否正常”的检查,而不是逐租户地点击门户选项卡。

    afi-cli fleet-health --since 24h --agent
    
  • resolve——将 Microsoft 365 / Google Workspace ID、电子邮件或名称映射到规范的 Afi 资源或租户,包括多地域(Multi-Geo)分发。

    在任何离职或审计之前运行此命令,以确定哪个 Afi 对象对应外部系统身份。

    afi-cli resolve [email protected] --agent
    
  • reconcile-licenses——比较购买的订阅数量与每个租户实际受保护的资源数量,以标记超额或不足配置。

    使用此命令进行每周许可证漂移检查,目前这需要手动在两个门户屏幕之间进行电子表格拼接。

    afi-cli reconcile-licenses --org 01F0ORG0000000000000000000 --json
    
  • backup-stale——标记最新备份归档早于阈值的受保护资源——即受保护但静默失败的资源。

    使用此命令来捕获静默失败类问题:那些附加了策略但备份已悄然停止着陆的资源。

    afi-cli backup-stale --max-age 48h --agent
    
  • tenant-scorecard——一个租户的完整备份状态:覆盖率百分比、上次任务状态、最新/最旧归档年龄和配额状态。

    在准备客户工单或季度业务回顾(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 表示至少有一个匹配;退出码 2 表示没有确信的匹配——请回退到 --help 或使用更窄的查询。

配方

周一集群检查

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

刷新集群存储(跳过繁重的归档遍历),然后仅列出有失败任务或配额违规的租户。

查找单个租户中的备份盲点

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

资源表与保护表的 LEFT JOIN,缩小到代理打开工单所需的三个字段。

安全地处理离职员工

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

将模糊的邮箱解析为规范的 Afi 资源,然后预览安全的最终备份-验证-释放序列,最后再实际执行。

捕获静默失败的备份

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

最新归档早于两天的受保护资源——任何门户屏幕都无法显示的故障类别。

许可证漂移检查

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

购买的订阅数量与实际受保护资源数量的对比,按租户列出。

认证设置

在 Afi 门户中创建应用程序和 API 密钥(组织级别:配置 → 应用;租户级别:服务 → 设置 → 应用),然后设置 AFI_API_KEY。该密钥作为原始的 Authorization 头部值发送(Afi 密钥看起来像 appkey-...;没有 Bearer 前缀)。每个应用程序支持两个用于轮换的密钥。密钥继承应用程序的安装范围——如果某个租户或组织在结果中缺失,请检查应用程序安装在何处。

运行 afi-cli doctor 以验证设置。

代理模式

在任何命令后添加 --agent 标志。展开为:--json --compact --no-input --no-color --yes。

  • 可管道输出 — JSON 到标准输出,错误信息到标准错误

  • 可过滤 — --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 以了解数据是来自线上还是本地。只有在标准输出是终端且未设置任何机器可读格式标志(--json、--csv、--compact、--quiet、--plain、--select)时,才会将人类可读的 N results (live) 摘要打印到标准错误——管道/代理消费者和显式格式运行只会得到纯净的 JSON 到标准输出。

代理反馈

当您(或代理)注意到此 CLI 有什么问题时,请记录它:

afi-cli feedback "--since 标志是包含性的,但文档说它是排他性的"
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 出去。默认行为是仅本地存储。

请写下令您感到惊讶的内容,而不是一份错误报告。简短、具体、一行:这是最有价值的部分。

输出路由

每个命令都接受 --deliver <sink> 参数。输出将除了发送到标准输出之外(或代替标准输出),还会发送到指定的接收端,这样代理就可以路由命令结果而无需手动管道操作。支持三种接收端:

接收端效果
stdout默认;仅写入标准输出
file:<path>自动将输出写入 <path>(临时文件 + 重命名)
webhook:<url>将输出体 POST 到该 URL(application/json 或当 --compact 时为 application/x-ndjson)

未知的方案将被拒绝,并返回一个包含所支持集合的结构化错误。Webhook 失败会返回非零退出码,并在标准错误上记录 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. 其他任何情况 → 直接使用(以 --agent 标志执行 CLI 命令)

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.

相关技能