Best for
- Reach for this CLI when a task touches SkyKick / ConnectWise Cloud Services M365 backup at fleet scale: auditing which customer tenants are protected, finding stale mailbox snapshots, reconciling discovered-vs-enabled c…
Servosity/msp-skills/skills/skykick/SKILL.md
Fleet-wide M365 backup assurance for SkyKick Cloud Backup - posture, stale snapshots, and coverage gaps no portal or wrapper can show. Trigger phrases: `check skykick backups`, `which customers aren't backed up`, `stale skykick snapshots`, `skykick fleet health`, `skykick backup alerts`, `audit m365 backup retention`, `use skykick`, `run skykick-cli`.
Decision brief
Fleet-wide M365 backup assurance for SkyKick Cloud Backup - posture, stale snapshots, and coverage gaps no portal or wrapper can show. Trigger phrases: `check skykick backups`, `which customers aren't backed up`, `stale skykick snapshots`, `skykick fleet health`, `skykick backup alerts`, `audit m365 backup retention`, `use skykick`, `run skykick-cli`.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/Servosity/msp-skills --skill "skills/skykick"Inspect the Agent Skill "skykick" from https://github.com/Servosity/msp-skills/blob/30e109db0872897de0b88adb38d81d4c292da3ae/skills/skykick/SKILL.md at commit 30e109db0872897de0b88adb38d81d4c292da3ae. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
SkyKick uses OAuth2 client-credentials behind Azure API Management with a twist: the token request needs HTTP Basic auth (API user ID + subscription key) AND an Ocp-Apim-Subscription-Key header, and every API call carries both the Bearer token and the subscription key. Set SKYKI…
This skill drives the skykick-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
Reach for this CLI when a task touches SkyKick / ConnectWise Cloud Services M365 backup at fleet scale: auditing which customer tenants are protected, finding stale mailbox snapshots, reconciling discovered-vs-enabled coverage after onboarding, sweeping and bulk-completing alert…
Do not use this CLI for: - Do not use this CLI to create or manage SkyKick MIGRATION orders - the Migrate/Manage API families are login-gated and not exposed here - Do not use it to enable/disable backup for a mailbox or site - the public API exposes no enablement writes; use th…
These capabilities aren't available in any other tool for this API.
Permission review
The documentation asks the agent to run terminal commands or scripts.
npx -y @mvanhorn/printing-press-library install skykick --cli-onlyThe documentation asks the agent to run terminal commands or scripts.
go install github.com/mvanhorn/printing-press-library/library/monitoring/skykick/cmd/skykick-cli@latestThe documentation includes network, browsing, or remote request actions.
SkyKick uses OAuth2 client-credentials behind Azure API Management with a twist: the token request needs HTTP Basic auth (API user ID + subscription key) AND an Ocp-Apim-Subscription-Key header, and every API call carries both the Bearer toThe documentation includes sending, uploading, or posting data to a remote service.
| `webhook:<url>` | POST the output body to the URL (`application/json` or `application/x-ndjson` when `--compact`) |The documentation includes network, browsing, or remote request actions.
| `webhook:<url>` | POST the output body to the URL (`application/json` or `application/x-ndjson` when `--compact`) |Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 85/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 15 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
This skill drives the skykick-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
$HOME/.local/bin on macOS/Linux and %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows:
npx -y @mvanhorn/printing-press-library install skykick --cli-only
skykick-cli --version$PATH for the agent/runtime that will invoke this skill.If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.4 or newer). This installs into $GOPATH/bin (default $HOME/go/bin), so add that directory to $PATH instead:
go install github.com/mvanhorn/printing-press-library/library/monitoring/skykick/cmd/skykick-cli@latest
If --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
Every evidenced SkyKick (ConnectWise Cloud Services) Backup API operation as typed commands, plus a local SQLite fleet store that answers the questions the per-tenant API can't: which customers aren't fully protected (fleet-health), which mailboxes silently stopped snapshotting (stale-snapshots), and what changed since last review (drift). Built for the current apis.cloudservices.connectwise.com host - the only CLI that works post-migration.
Reach for this CLI when a task touches SkyKick / ConnectWise Cloud Services M365 backup at fleet scale: auditing which customer tenants are protected, finding stale mailbox snapshots, reconciling discovered-vs-enabled coverage after onboarding, sweeping and bulk-completing alerts, or producing QBR-ready retention and autodiscover compliance tables. Single-tenant reads (settings, mailboxes, sites, SKU) work too, with --json/--select for agent pipelines.
Do not use this CLI for:
These capabilities aren't available in any other tool for this API.
fleet-sync - One command pulls every subscription plus per-tenant settings, retention, autodiscover, snapshot stats, mailboxes, sites, and alerts into the local SQLite fleet store.
Run this first; every fleet-posture and backup-integrity command reads the store it builds.
skykick-cli fleet-sync --agent
fleet-health - One cross-tenant protection posture table - every subscription's Exchange/SharePoint enablement, retention, autodiscover, and last-backup age with gap flags.
The single command an MSP owner runs to see fleet-wide backup posture without per-tenant portal crawling.
skykick-cli fleet-health --flag-gaps --agent
retention-audit - Grades each tenant's retention period against a compliance floor you set.
Turns scattered retention numbers into a pass/under-floor compliance attestation for QBRs.
skykick-cli retention-audit --floor-days 365 --agent
autodiscover-audit - Fleet table of autodiscover on/off state per tenant.
Surfaces tenants where new hires will silently go unprotected because autodiscover is off.
skykick-cli autodiscover-audit --only-off --agent
partner-rollup - Protection posture aggregated by partner for distributor oversight.
Gives a distributor a per-partner protection scorecard the API can't assemble.
skykick-cli partner-rollup --agent
stale-snapshots - Every mailbox not snapshotted within N hours, fleet-wide.
Silently-stale mailboxes are the top MSP backup liability; this finds them all in one call.
skykick-cli stale-snapshots --hours 48 --agent
coverage-gaps - Discovered-but-unprotected mailboxes and SharePoint sites per tenant.
Catches new hires and sites that exist but aren't actually backed up after onboarding or churn.
skykick-cli coverage-gaps --type mailboxes --agent
drift - Diffs two sync snapshots and reports protection-state changes since last sync.
Surfaces newly-stale mailboxes, dropped subscriptions, and enablement flips between reviews.
skykick-cli drift --agent
alert-sweep - One ranked list of open alerts across the whole fleet, with optional bulk mark-complete.
Replaces N per-id portal lookups with one cross-fleet triage view plus bulk closure.
skykick-cli alert-sweep --agent
watch-operation - Polls an async operation to a terminal state with backoff in one command.
Lets onboarding discovery complete unattended instead of hand-polling operation status.
skykick-cli watch-operation 1a2b3c4d-0000-0000-0000-000000000000 --timeout 300
alerts - Alerts for backup services and email migration orders
skykick-cli alerts complete - Mark a specific alert as completeskykick-cli alerts list - List alerts for a backup service or email migration order (max 500; the API does not support skip paging)backup - Cloud Backup subscriptions - M365 Exchange and SharePoint protection per customer tenant
skykick-cli backup autodiscover - Auto-discover state (enabled/disabled) for Exchange and SharePointskykick-cli backup by-partner - List backup subscription orders for a specific partnerskykick-cli backup datacenters - List the Azure data centers available for backup storageskykick-cli backup discover-mailboxes - Trigger Exchange mailbox discovery (async; poll the returned operation with watch-operation)skykick-cli backup discover-sites - Trigger SharePoint site discovery (async; poll the returned operation with watch-operation)skykick-cli backup jobs - Active backup jobs for the subscription (known upstream defect: may return Unknown error, community-reported since 2024)skykick-cli backup last-snapshot-stats - Last snapshot statistics for all mailboxes in the subscriptionskykick-cli backup list - List all placed backup subscription orders across your customersskykick-cli backup mailbox - Details of a specific Exchange mailbox in the subscriptionskykick-cli backup mailboxes - Exchange mailboxes and their backup enabled/disabled status (IndividualMailboxes array)skykick-cli backup retention-period - Data retention periods for Exchange and SharePoint (response field ExchangeRentionPeriodInDays is the upstream spelling)skykick-cli backup sites - SharePoint site URLs and their backup enabled/disabled statusskykick-cli backup sku - SKU and promotional details for a backup subscriptionskykick-cli backup storage-settings - Storage settings for a backup subscriptionskykick-cli backup subscription-settings - Subscription settings: Exchange/SharePoint backup state, enabled counts, customer infoidentity - Authenticated caller identity
skykick-cli identity - Show the identity and context of the authenticated API useroperations - Async operation tracking and work queue
skykick-cli operations status - Poll the status of an async operation (e.g. a discovery run)skykick-cli operations workqueue - Retrieve the work queue for the authenticated accountWhen you know what you want to do but not which command does it, ask the CLI directly:
skykick-cli which "<capability in your own words>"
which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match - fall back to --help or use a narrower query.
skykick-cli fleet-sync && skykick-cli fleet-health --flag-gaps --agent
Refresh the fleet store then emit one posture row per tenant with gap flags - the daily is-everyone-protected loop.
skykick-cli stale-snapshots --hours 48 --agent --select mailbox,subscription_id,last_snapshot
Mailboxes with no snapshot in 48h, narrowed to the three fields an agent needs to open tickets.
skykick-cli coverage-gaps --type mailboxes --agent
After running 'backup discover-mailboxes ' and 'watch-operation ' (the discover response carries the id), list anything discovered but not protected.
skykick-cli alert-sweep --agent
Fan /Alerts across every stored subscription and return one ranked open-alert list.
skykick-cli retention-audit --floor-days 365 --agent --select company,exchange_retention_days,status
Grade every tenant against a 1-year retention floor and keep only the columns the QBR deck needs.
SkyKick uses OAuth2 client-credentials behind Azure API Management with a twist: the token request needs HTTP Basic auth (API user ID + subscription key) AND an Ocp-Apim-Subscription-Key header, and every API call carries both the Bearer token and the subscription key. Set SKYKICK_CLIENT_ID to your API user ID and SKYKICK_CLIENT_SECRET to your subscription key (Partner Portal -> Settings -> User Profile -> Developer API Access; click Show on the Partner Subscription). The CLI mints and caches tokens automatically - SkyKick rate-limits the token endpoint aggressively, so cached reuse matters. Set SKYKICK_OAUTH_SCOPE=Distributor for distributor accounts (default Partner).
Run skykick-cli doctor to verify setup.
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
Pipeable - JSON on stdout, errors on stderr
Filterable - --select keeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:
skykick-cli alerts list <id> --agent --select id,name,status
Previewable - --dry-run shows the request without sending
Offline-friendly - sync/search commands can use the local SQLite store when available
Non-interactive - never prompts, every input is a flag
Explicit retries - use --idempotent only when an already-existing create should count as success
Commands that read from the local store or the API wrap output in a provenance envelope:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}
Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal AND no machine-format flag (--json, --csv, --compact, --quiet, --plain, --select) is set - piped/agent consumers and explicit-format runs get pure JSON on stdout.
When you (or the agent) notice something off about this CLI, record it:
skykick-cli feedback "the --since flag is inclusive but docs say exclusive"
skykick-cli feedback --stdin < notes.txt
skykick-cli feedback list --json --limit 10
Entries are stored locally at ~/.local/share/skykick-cli/feedback.jsonl. They are never POSTed unless SKYKICK_FEEDBACK_ENDPOINT is set AND either --send is passed or SKYKICK_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect |
|---|---|
stdout | Default; write to stdout only |
file:<path> | Atomically write output to <path> (tmp + rename) |
webhook:<url> | POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
skykick-cli profile save briefing --json
skykick-cli --profile briefing alerts list <id>
skykick-cli profile list --json
skykick-cli profile show briefing
skykick-cli profile delete briefing --yes
Explicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
| Code | Meaning |
|---|---|
| 0 | Success |
| 2 | Usage error (wrong arguments) |
| 3 | Resource not found |
| 4 | Authentication required |
| 5 | API error (upstream issue) |
| 7 | Rate limited (wait and retry) |
| 10 | Config error |
Parse $ARGUMENTS:
help, or --help → show skykick-cli --help outputinstall → ends with mcp → MCP installation; otherwise → see Prerequisites above--agent)go install github.com/mvanhorn/printing-press-library/library/monitoring/skykick/cmd/skykick-mcp@latest
claude mcp add skykick-mcp -- skykick-mcp
claude mcp listwhich skykick-cli
If not found, offer to install (see Prerequisites at the top of this skill).--agent flag:
skykick-cli <command> [subcommand] [args] --agent
skykick-cli <command> --help.