zscaler/zscaler-mcp-server/audit-baseline-compliance
Claude Code and agent skill by zscaler/zscaler-mcp-server
- community
Checking that the SKILL.md file is still in the repository.
Read-only audit of a ZPA tenant against the Zscaler ZPA Baseline Recommendations v1.0 document. Inventories app connector groups, server groups, application segments, access policy rules, forwarding policy rules, timeout policy rules, and (when available) LSS configs, then scores ~26 configuration-only checks across 7 categories and renders an interactive Zscaler-styled web report (single-file HTML, plus an optional .jsx component) — searchable, filterable by category, severity, and security framework (NIST SP 800-53 Rev. 5 and CIS Critical Security Controls v8), with per-finding evidence, remediation, and framework citations suitable as supporting evidence for SOC 2, FedRAMP, ISO 27001, and NIST CSF assessments, and printable to PDF from the browser. Use when an administrator asks to audit ZPA against best practices, run a baseline-compliance review, get a ZPA health check, gather compliance evidence, or see how their tenant compares to the recommended baseline. NEVER mutates the tenant — read-only.
Install
npx vskill@latest install zscaler/zscaler-mcp-server/audit-baseline-complianceSKILL.md
ZPA: Audit Baseline Compliance
Keywords
zpa audit, zpa best practices, zpa baseline, zpa health check, zpa compliance review, baseline recommendations, zpa configuration audit, zpa policy audit, connector group audit, zpa hardening, zpa review, security baseline check, ZPA Baseline Recommendations v1.0
Overview
Audit a ZPA tenant's configuration against the Zscaler ZPA Baseline Recommendations v1.0 document. This skill is fully read-only — it inventories the tenant via existing list/get MCP tools, scores each finding against the baseline doc, and renders the result as a standalone Zscaler-styled web report (a single self-contained HTML file). A matching React component (ZpaAuditReport.jsx) is also generated for teams that want to embed the same view in an existing portal.
Use this skill when: An administrator asks to audit their ZPA tenant against best practices, run a baseline-compliance review, get a "ZPA health check", or see how their configuration compares to the recommended baseline.
Hard constraints — what this skill does not do
- No writes. Only
zpa_list_*andzpa_get_*tools. Never callzpa_create_*,zpa_update_*, orzpa_delete_*. - No telemetry checks. ZPA does not expose live connector CPU/memory/throughput, app probe results, session counts, or LSS log delivery health. Checks that require runtime data are not silently skipped — they are listed in the report's "Cannot Audit" section so the user knows what's missing and can request new APIs later.
- Configuration-only. Every check evaluates a field on a resource the API returns. Heuristic checks (e.g. naming-pattern matches for "sensitive" / "lss" / "discovery") are clearly marked as heuristic in the report.
- No external network calls from the report at view time. The HTML file embeds all findings inline; the only runtime external loads are the Tailwind/React/Babel CDN scripts needed to render it. (For air-gapped environments, see "Offline mode" in Step 4.)
Workflow
Step 1: Confirm scope
Before running anything, confirm with the administrator:
- Scope: full audit (all categories) or a single category (Connectors, Server Groups, Segments, Access Policy, Forwarding Policy, Timeout Policy, LSS).
- Microtenant: if the tenant uses microtenants, ask which one to inventory (default: the parent tenant). This is an inventory-scope decision only; it is not stored in the audit JSON or shown on the report.
If the user asked a generic "audit my ZPA tenant" question, default to full audit, parent tenant and proceed without further questions.
The skill does not record a tenant identifier in the report. The vanity domain, customer ID, and cloud realm live in the Zscaler MCP server's authentication context (env vars / config at server startup) and are not returned by anyzpa_list_*/zpa_get_*tool — and rather than inviting the agent to guess (or compose strings from email addresses, file names, orzscaler_check_connectivityoutput), the report header simply omits tenant identity. The audit timestamp and inventory line are enough to identify a given run.
Step 2: Inventory the tenant (read-only)
Claude Desktop pre-step (deferred tool loading). Claude Desktop lazy-loads MCP tool schemas via tool_search and refuses to invoke a tool whose schema isn't cached yet (you'll see "`<tool>` has not been loaded yet. Call tool_search first"). Before the inventory, prime the cache with a single search so all the read tools below are loaded in one shot:
If you skip this and call zpa_list_lss_configs (or any other tool) directly, the first call will fail with the "not loaded yet" error, you'll have to retry, and one inventory tool may end up silently skipped. This pre-step is a no-op on Cursor and Gemini CLI but is required on Claude Desktop / Cowork.
Then call these tools in parallel where possible. Capture the full result of each:
Pagination: if any list returns the maximum page size (typically 500), paginate with page_size=500, page=N until exhausted. The audit is incomplete on a partial inventory.
Errors: if a tool returns an error (e.g. service disabled, missing scope, or the "not loaded yet" deferred-loading error), record the category as "Cannot Audit — API error" with the error message and continue with the rest. Do not abort the whole audit. For "not loaded yet", retry the same tool once after running the tool_search pre-step above; if it still fails, mark the category as "Cannot Audit" and move on.
Inventory transparency: the inventory string you build here gets embedded into the report as a one-line summary so the admin can see which categories were actually fetched. Build it like:
Inventoried: 4 connector groups, 12 server groups, 30 application segments, 1 access rule, 0 forwarding rules, 2 timeout rules, 0 LSS configs.
LSS specifics: the LSS API is configuration-only (returns LSS config records and the metadata catalogs). It cannot tell you whether logs are actually flowing to the SIEM, dropping, or arriving late — that's an out-of-band, SIEM-side observation. The audit can only verify configuration shape; live delivery health is in the "Cannot Audit" section.
Step 3: Score the findings
Apply each check below to the inventory. Each finding has:
- `id` — short stable identifier (e.g.
acg-n-plus-one) - `category` — one of:
Connectors,ServerGroups,Segments,AccessPolicy,ForwardingPolicy,TimeoutPolicy,LSS,CannotAudit - `severity` —
critical,warning,info, orcannotAudit - `title` — one-line human summary
- `evidence` — short list of resource names / IDs that triggered the finding (max 10; truncate longer lists with
…and N more) - `docRef` — page or section in the baseline doc (e.g.
§Health Reporting Recommendations, page 23) - `remediation` — one or two sentences pointing the user at the right fix (often: "use the
zpa/<other-skill>skill") - `heuristic` —
trueif the check relies on naming patterns rather than a definitive field - `frameworks` — optional object with
nist80053r5andcisV8arrays of control identifiers. Use the lookup table in [Step 3a — Framework mapping](#step-3a--framework-mapping) verbatim; do not invent or generalize citations. Omit the field entirely (or both arrays empty) if the check has no high-confidence mapping —acg-geo-coordsis the only check intentionally left unmapped.
Important: every finding the report emits must be one of the IDs below. Do not invent new IDs; if a check does not apply, omit the finding entirely (the report only shows triggered findings — no "passes" section).
App Connector Group checks
| ID | Severity | Check | |
|---|---|---|---|
acg-n-plus-one | warning | Each AC group has ≥ 2 connectors (N+1 minimum). Flag groups with 0 or 1. | |
acg-geo-coords | info | AC groups have non-empty latitude / longitude for geo-routing. | |
acg-version-drift | warning | Each connector's current_version matches expected_version. | |
acg-cert-expiring | warning | Connector enrollment certificates expiring in <30 days. Use enrollment_cert.valid_to_in_epoch_sec if exposed. | |
acg-enclave-isolation | warning (heuristic) | AC groups whose name matches *sensitive*, *enclave*, *pci*, *hr*, *finance* are referenced by only "enclave-style" server groups (no broad SGs). | |
acg-lss-isolation | warning (heuristic) | AC group whose name matches *lss* or *log* is not bound to any application segment via a server group. |
Server Group checks
| ID | Severity | Check | |
|---|---|---|---|
sg-dynamic-discovery | info | dynamic_discovery == True. Flag any SG with it disabled and recommend re-enabling unless strict per-server segmentation is documented. | |
sg-no-ac-group | critical | SG has at least one app_connector_group bound. Zero = broken SG. | |
sg-overly-broad | warning (heuristic) | Non-Discovery / non-Global SGs that bind all AC groups in the tenant. Identify Discovery / Global SGs by name match (*discover*, *global*). |
Application Segment checks
| ID | Severity | Check | |
|---|---|---|---|
seg-health-discovery | warning | Discovery wildcard segments (domain contains *) have health_reporting != "NONE". Should be NONE per doc page 23. | |
seg-health-default | info | Standard segments (single FQDN, single SG) use health_reporting == "ON_ACCESS". | |
seg-double-wildcard | critical | No segment uses *.* or any single * as a domain (overly broad). | |
seg-ip-only | info | Segments using only IPs / CIDRs (no FQDNs). Recommend FQDN migration. | |
seg-no-server-group | critical | Segment has at least one server_group bound. |
Access Policy checks
| ID | Severity | Check | |
|---|---|---|---|
ap-block-all-bottom | critical | The last access-policy rule is an explicit DENY matching all (no scoped conditions). Doc class H. | |
ap-posture-per-os | critical | If any rule includes POSTURE failed-with-PLATFORM, all five OSes (Windows, macOS, iOS, Android, Linux) are covered. Missing OSes = silent allow on those platforms. Doc page 30. | |
ap-contractor-pair | warning (heuristic) | If any rule scopes to a SCIM group whose name matches *contractor*, *vendor*, *partner*, there is a paired DENY rule for the same group (block-rest pattern). Doc class C/C'. | |
ap-discovery-bottom | warning (heuristic) | Rules referencing wildcard discovery segments (segment name matches *discovery* or domain contains *) are at the bottom of the policy (above only the Block-All rule). Doc class G. | |
ap-crown-jewel-hardening | warning (heuristic) | ALLOW rules referencing crown-jewel app segments (name matches *finance*, *hr*, *admin*, *pci*, *sap*, *workday*) include both CLIENT_TYPE and POSTURE conditions. Doc class E. | |
ap-deception-present | info | A deception-style rule exists (auto-provisioned when Deception is licensed — informational only, do not modify). Doc class A. |
Forwarding Policy checks
| ID | Severity | Check | |
|---|---|---|---|
fp-no-double-wildcard | critical | No INTERCEPT rule uses *.* or a CIDR ≥ /16 (e.g. 10.0.0.0/8). Doc page 36. | |
fp-bypass-coverage | warning | Canonical bypass list covered: Microsoft (*.microsoft.com, login.microsoftonline.com, *.windowsupdate.microsoft.com), Apple (*.apple.com, *.icloud.com), CRL/OCSP (crl.*, ocsp.*). | |
fp-scim-scoped | warning (heuristic) | INTERCEPT rules include a SCIM_GROUP operand (avoids leaking the full app list to every ZCC). |
Timeout Policy checks
| ID | Severity | Check | |
|---|---|---|---|
tp-auth-range | warning | reauth_timeout between 24 hours and 7 days. Flag values outside that window. Doc page 38. | |
tp-idle-floor | warning | reauth_idle_timeout ≥ 10 minutes (or Never for service-account rules). Doc page 38. | |
tp-sensitive-tight | info (heuristic) | Rules scoped to sensitive segments (name match *finance*, *hr*, *pci*, *sap*) have reauth_idle_timeout ≤ 15 minutes. |
LSS checks
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/zpa/audit-baseline-compliance/SKILL.md
Popularity
- Repository stars
- 39
- Repository forks
- 18
- 7-day trend score
- 18
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/zscaler/zscaler-mcp-server/audit-baseline-compliance)