Skip to main content
Unbound has three policy types: Cost, Security, and Tool. Each has its own subcommand for type-specific creation. Generic commands (list, get, delete) work across Cost and Security; Tool policies use a separate policy tool subcommand.

Reference data

Before creating policies, pull the available user groups, models, guardrails, and tool types:

Generic commands (Cost / Model / Security)

Use the type-specific commands — policy cost create, policy security create, and the policy tool family below — for guided, flag-based create and update. Each also has an update <id> that changes only the fields you pass.
The same type filter applies to type-specific list and update commands:

Cost policies

Set a monthly spend limit per user group:
Scope it to a team, order it against your other policies, or stage it before it takes effect:
The same three flags work on policy security create. See Cost Policies for all configuration options.

Security policies

Apply guardrails for PII and secrets detection:
See Security Policies for all configuration options.

Tool policies

Tool policies control shell commands and MCP tool calls. They use a separate backend and are reached via unbound policy tool.

List and inspect

Tool policies are paginated at 50 per page:

Discover available targets

Create a terminal command policy

Describe it in plain English

If you don’t know the family or the field to match on, describe what you want and let Unbound author the policy:
You get a preview of the policy it drafted and a confirmation step before anything is created. Each --prompt run creates exactly one policy, so describe one rule at a time. Add --yes to skip the confirmation (the preview still prints), or --no-ai to use the raw classification flags instead. --prompt can’t be combined with --command-family, --field, or --config. You can still pass --name, --description, --action, --custom-message, --group, --disabled, --yes and --json.
create-terminal and create-mcp need you to pick a mode: either --prompt "<description>" for AI assist, or --no-ai to pass the raw classification flags. Running either with neither exits 2.--no-ai is refused when the CLI runs inside Claude Code, so an agent can’t bypass AI assist. Set UNBOUND_ALLOW_NO_AI_UNDER_CLAUDE=1 if you’re driving the terminal yourself.Whenever the resolved action is BLOCK or WARN, --custom-message is required — those policies always need a user-facing message.
Tool policies can’t scope by environment, project, time window, or exception clause. If your prompt mentions one — “production”, “after hours”, “except…” — the CLI warns that those parts will be ignored and asks whether to continue. Prompts are capped at 1,800 characters.

Match a command we don’t classify

Most commands fall into a family (filesystem, cloud_destroy, git_action, …). When yours doesn’t, or you want to match one exact command rather than a category, use the custom family and give it the whole command pattern:
custom takes a single command field — the pattern is matched against the whole command line. Run unbound policy tool families to see every family and the fields each one accepts.

Create an MCP tool policy

Available actions: BLOCK, WARN, AUDIT, REQUIRE_SLACK_APPROVAL

Update a tool policy

Only the fields you pass are changed:
The cost and security policy types each have an update <id> too. policy cost update takes --monthly-budget plus --name, --group, --priority and --enabled / --disabled. policy security update takes those shared flags, but guardrail and routing changes go through --config '<json>' — the create-time --sub-type / --guardrail / --route flags aren’t accepted on update:

See Tool Policies for the full list of actions, NL rules, and canonical group targeting. Every list, get, create and update command supports --json for machine-readable output. delete doesn’t — it takes only --yes.

Tool Policies

Dashboard reference for actions, NL rules, and Slack approvals

Cost Policies

Dashboard reference for budget limits and spend controls