Toolsets¶
Tools are grouped into named toolsets so you can load only the slice of tools an agent actually needs — for example zia_url_filtering (5 tools) instead of every tool from every service (~300+). Toolsets are the recommended way to scope what an agent can see when you don’t need the full catalog.
Why toolsets exist¶
Most MCP clients (Claude Desktop, Cursor, Gemini CLI) use deferred tool loading — they don’t load all 300+ tools upfront. They search for relevant tools based on the user’s prompt. Loading the whole catalog has three costs:
Tool search noise. The client returns the closest N tools regardless of relevance. With 300+ tools loaded, many of those matches are unrelated.
Context window pressure. Every loaded tool occupies a slice of the agent’s prompt budget.
Audit blast radius. Disabled-by-default narrowing is the cleanest way to keep a server scoped to “this agent only handles ZIA URL filtering.”
The toolset system solves all three: pick the toolsets you want, and only those tools are registered.
The catalog¶
There are 52 toolsets today, organized by service:
Service |
Toolsets |
Identifiers |
|---|---|---|
ZIA |
21 |
|
ZPA |
19 |
|
ZDX |
5 |
|
ZCC |
1 |
|
ZTW |
1 |
|
ZIdentity |
1 |
|
EASM |
1 |
|
Z-Insights |
1 |
|
ZMS |
1 |
|
Meta (always-on) |
1 |
|
The meta toolset is always loaded regardless of selection — it provides the discovery tools an agent uses to find other toolsets.
Selecting toolsets at startup¶
Three layers of selection control which toolsets are registered when the server starts:
Explicit selection —
--toolsetsflag orZSCALER_MCP_TOOLSETSenv var.Implicit fallback — every toolset whose service is in
--servicesis loaded.Entitlement filter — the selection is intersected with the products entitled by your OneAPI bearer token.
The most precise form is a comma-separated list of identifiers:
zscaler-mcp --toolsets zia_url_filtering,zpa_app_segments
Two special values:
--toolsets defaultloads a curated default-on subset (the operationally common toolsets for each service).--toolsets allloads every toolset.
When --toolsets is unset, the server falls back to “every toolset whose service is enabled” — preserving the legacy behaviour where --services zia,zpa loads every ZIA and ZPA tool.
Selection precedence¶
The filter order is fixed:
--disabled-tools/ZSCALER_MCP_DISABLED_TOOLS(negative blocklist withfnmatchwildcards)Toolset selection (from
--toolsetsorZSCALER_MCP_TOOLSETS)--enabled-tools(positive allowlist, if set)--write-tools(write-specific allowlist)
So --disabled-tools "zia_*" always wins, regardless of toolset selection. This is the right precedence — you can revoke a specific tool that the toolset would otherwise include.
The OneAPI entitlement filter¶
After the operator-driven selected_toolsets is resolved, the server intersects the selection with the products listed in the OneAPI bearer token’s service-info[].prd claim. The practical effect: if your tenant isn’t entitled to ZMS, the zms toolset is silently dropped from the selection even if you asked for it.
The filter is on by default and is non-fatal — missing credentials, decode failure, network error, or empty service-info all log a single WARN line and the selection passes through unchanged. To opt out:
# CLI flag
zscaler-mcp --no-entitlement-filter
# Or env var
ZSCALER_MCP_DISABLE_ENTITLEMENT_FILTER=true zscaler-mcp
The meta toolset is always preserved regardless of entitlement.
Runtime toolset enable¶
Toolset selection happens at server startup, but an agent can also enable a toolset on the fly by calling the always-on meta tool:
zscaler_enable_toolset(toolset="zia_url_filtering")
This registers every tool in the toolset using the same filter precedence as startup, so all rules (disabled_tools, write_tools) still apply. Useful when the agent encounters a request that needs tools it wasn’t initially given.
Discovery¶
Three always-loaded meta tools cover toolset discovery:
Tool |
Purpose |
|---|---|
|
List the catalog with |
|
List the member tools of a specific toolset with |
|
Register a toolset’s tools at runtime (see above). |
A toolset whose service is currently disabled returns can_enable: false with a reason explaining why — instead of leaving the agent to guess.
Per-toolset instructions¶
Each toolset can carry an instructions snippet that’s only sent to the agent when the matching tools are loaded. Snippets shared across multiple toolsets (for example the rule-family order/rank reminder bound to all five ZIA rule toolsets) are de-duplicated at compose time.
This keeps the model’s prompt focused: if you’re loaded with zpa_app_segments, you get ZPA segment-onboarding context; you don’t also get ZIA cloud-firewall rule-ordering guidance.
Helm chart and Kubernetes deployments¶
The Helm chart accepts a comma-separated --set toolsets=zia_url_filtering,zpa_app_segments value and forwards it to the container as ZSCALER_MCP_TOOLSETS. See the chart README at integrations/helm-chart for the full Helm story.
Environment summary¶
Variable / flag |
Effect |
|---|---|
|
Comma-separated toolset identifiers. |
|
When |
|
Skip the OneAPI entitlement-product intersection (emergency override). |
|
Negative blocklist applied after toolset selection. Supports |
|
Positive allowlist applied after toolset selection. |
|
Write-specific allowlist. Wildcards supported. |
See also¶
Zscaler Integrations MCP Server Tools — full catalog of underlying tools
Skills — guided multi-step workflows
Integrations — wiring the server into specific MCP clients