Loading image...Kiro

Product

  • About Kiro
  • IDE
  • CLI
  • Web
  • Mobile
  • Pricing
  • Downloads

For

  • Enterprise
  • Startups
  • Students

Community

  • Overview
  • Ambassadors
  • Discord
  • Events
  • Powers
  • Shop
  • Showcase

Resources

  • Docs
  • Blog
  • Changelog
  • FAQs
  • Report a bug
  • Suggest an idea
  • Billing support

Social

Site TermsLicenseResponsible AI PolicyLegalPrivacy PolicyCookie Preferences
Loading image...Kiro
  • CLI
  • IDE
  • Web
  • Mobile
  • Enterprise
  • Pricing
  • Docs
SIGN INDOWNLOADS
Loading image...Kiro

Get Started

InstallationAuthenticationYour first project

Models

OverviewAvailable modelsReasoning effort

Features

How Kiro works
Specs
Steering
Hooks
MCP
Permissions
Custom agents
Agent Skills
Powers
CompactionKiroignoreCheckpoints and rewind
Built-in tools
Configuration scopes

IDE 1.x

What's new in 1.0
Setup & First Run
Editor
Chat
Experimental
Troubleshooting0.x reference

CLI

What's new in 3.0
Setup & First Run
Terminal UI
Chat
Headless modeACPAuto complete
Experimental
2.x reference

Web - Preview

Setup & First RunIdentity Center
Connect your repositories
Working with the agent
Autonomous modeAutomations
Sandbox

Mobile - Preview

Overview

Commands and Reference

CLI commandsSlash commandsBuilt-in toolsExit codesSettingsIDE keyboard shortcuts

Billing

OverviewManaging your subscriptionUpgrading your planDowngrading your planCancelling your planPurchasing add-on creditsManaging your paymentsManaging usage notificationsManaging your taxesContacting billing supportDeleting your accountRelated questions

Enterprise

ConceptsOnboarding quickstart
Connecting your identity provider
Subscribe your teamManage subscriptions
Governance
Monitor and track
SettingsManaged updatesBillingIAMSupported regions

Privacy and Security

OverviewData protectionCode referencesCompliance validationInfrastructure securityIAM permissionsFirewalls, proxies, and data perimetersVPC endpoints (AWS PrivateLink)

Guides

Overview
Language support
Learn by playing

Migration

Migrating from Q DeveloperMigrating from VSCodeUpgrading from Q CLI
  1. Docs
  2. Features
  3. Permissions

Permissions


Kiro uses a capability-based permissions system that gives you fine-grained, declarative control over what the agent can do. You define rules per capability with match patterns and explicit effects, replacing older binary trust models.

CapabilityIDECLIWebMobile
Permissions YAML configuration✓✓——
Interactive approval prompts✓✓——
Global + workspace scopes✓✓——

How it works

The permissions system is built around three core concepts:

ConceptDescription
Capabilitiesfs_read, fs_write, shell, web_fetch, web_search, mcp, subagent, skill, power, context, diagnostics, sandbox_network. Meta-capabilities expand: all (everything), builtin (all built-in tools), filesystem (fs_read + fs_write)
Effectsdeny (block always), ask (prompt you), allow (proceed silently)
Prioritydeny > ask > allow - a deny rule always wins regardless of scope

Additional rule properties:

PropertyDescription
Match patternsGlob patterns scoping the rule (file paths for fs, command prefixes for shell, server/tool names for MCP)
ExcludeOptional glob patterns that must NOT match - enables "allow everything except X"

Defining rules

Permissions are defined in YAML files at two levels:

User-scoped (~/.kiro/settings/permissions.yaml) - applies across all projects. Use to pre-approve trusted operations:

yaml
rules: - capability: shell match: ["git *", "npm *", "npx *"] effect: allow - capability: fs_write match: ["src/**", "tests/**"] effect: allow - capability: fs_read effect: allow - capability: mcp match: ["my-server/*"] effect: allow

Workspace-scoped (~/.kiro/workspace-roots/<hash>/permissions.yaml) - applies only to a specific project. Use to scope rules to one codebase:

yaml
rules: - capability: fs_write match: ["*.env", "*.pem", "*.key"] effect: deny - capability: shell match: ["rm -rf *", "sudo *"] effect: deny

Both scopes support all effects (deny, ask, allow).

Info

Workspace permissions are stored per-user outside the repository at ~/.kiro/workspace-roots/<hash(workspaceRoot)>/. A cloned repo cannot inject permission rules - trust is something you configure on your own machine.

Exclude syntax

Rules support an exclude field for "allow everything except" patterns:

yaml
rules: - capability: mcp match: ["my-server/*"] exclude: ["my-server/dangerous-tool"] effect: allow

Pattern matching

Rules use glob patterns. The syntax differs by capability type:

Filesystem patterns (fs_read, fs_write):

  • * matches within a single path component
  • ** matches across path separators
  • {a,b} brace expansion and [abc] character classes are supported
  • Patterns without wildcards implicitly match children: ~/temp matches ~/temp/child

Shell, web, and MCP patterns:

  • * matches any sequence of characters
  • **, ?, and character classes are not supported
yaml
rules: # Allow npm commands except npm publish - capability: shell effect: allow match: - "npm *" exclude: - "npm publish*" # Deny reads to secrets at any depth - capability: fs_read effect: deny match: - "**/.env" - "**/.env.*" - "secrets/**" - "**/*.pem"

Shell command parsing

Shell commands are parsed before pattern matching. Compound commands (using ;, &&, ||, |) are split and each sub-command is evaluated independently. This prevents a rule for npm test * from accidentally matching npm test ; curl attacker.com.

Scopes

Permissions are evaluated across multiple scopes. The most restrictive effect wins regardless of which scope it came from.

ScopeLocationAllowed effects
KiroHardcoded security invariants (cannot be overridden)deny, ask
administrationEnterprise/MDM-managed policy (enterprise plans only)deny, ask
user~/.kiro/settings/permissions.yamldeny, ask, allow
workspace~/.kiro/workspace-roots/<hash>/permissions.yamldeny, ask, allow
agentEmbedded in agent profile (permissions field)deny, ask, allow
sessionIn-memory rules from consent decisions during the sessiondeny, ask, allow

Rules are evaluated using a deny-overrides algorithm: deny > ask > allow. There is no precedence between scopes - the most restrictive effect wins regardless of which scope it came from.

Warning

A deny rule in any scope blocks the action regardless of allow rules elsewhere. Be deliberate with deny rules since they cannot be overridden.

Default behavior

Without any permissions.yaml configured, the default agent policy allows:

  • fs_read on ./** - read any workspace file silently
  • shell for common git read-only commands - git status, git log, git diff, git branch, and similar
  • shell for system info commands - pwd, whoami, uname, and similar
  • Utility tools (diagnostics, knowledge, and similar)

The Kiro scope (hardcoded, cannot be overridden) enforces:

  • Always denied: writes to ~/.kiro/settings/, .kiro/settings/, and ~/.kiro/workspace-roots/ (prevents the agent from modifying its own permission files)
  • Always asks: writes to .git/**, .kiro/agents/**, .kiro/hooks/**, .kiroignore

Everything else prompts for approval. Creating a permissions.yaml adds to these defaults; it does not replace them.

Managing permissions by surface

Agent autonomy setting

In addition to permissions.yaml rules, the IDE's agent autonomy is controlled via Settings → Agent → Agent Autonomy (settings key: kiroAgent.agentAutonomy). The two modes are:

  • Autopilot - the agent proceeds with allowed operations without prompting
  • Supervised - the agent prompts before any action

The capability-based permissions layer applies after the autonomy mode determines whether to proceed. Together, these two layers give you coarse-grained control (Autopilot vs Supervised) plus fine-grained rules (permissions.yaml) for specific capabilities.

Interactive approval flow

When a tool requires approval, a prompt appears in chat with four options:

ActionEffect
AllowApprove this specific invocation once
Always allowCreate a persistent allow rule (opens pattern/scope picker)
DenyBlock this specific invocation once
Always denyCreate a persistent deny rule

When you select Always allow, you configure two things:

  • Pattern - choose the match scope for the rule (e.g., cd * for any cd command, or the exact command path)
  • Apply to - choose where the rule persists:
    • All workspaces - saved to user-scoped ~/.kiro/settings/permissions.yaml
    • This workspace - saved to ~/.kiro/workspace-roots/<hash>/permissions.yaml (per-user, outside the repository)
    • This session - remembered in memory until the session ends

The pattern dropdown suggests a generalized version of the specific operation - for example, exact command git add contents/docs/ becomes pattern git add *, and exact path .env.local becomes .env* or **/.env*. You can edit the suggestion to be more restrictive or more permissive.

For chained commands (e.g., cd /path && cargo build), each sub-command in the chain is presented separately for approval.

Permission examples

Here are common patterns for configuring permissions:

ScenarioConfiguration
Trust file readscapability: fs_read, effect: allow
Trust write in project dirscapability: fs_write, match: ["src/**", "tests/**"], effect: allow
Block sensitive filescapability: fs_write, match: ["*.env", "*.pem", "*.key"], effect: deny
Block dangerous commandscapability: shell, match: ["rm -rf *", "sudo *"], effect: deny
Trust specific MCP servercapability: mcp, match: ["my-server/*"], effect: allow
Untrust shell in productioncapability: shell, effect: ask (or use /tools untrust shell in CLI)

Migrating from older versions

If you're upgrading from CLI 2.x or IDE 0.x, see the reference pages for how permissions worked previously and what changed:

  • CLI 2.x reference - Permissions
  • IDE 0.x reference - Permissions
  • What's new in CLI 3.0 - Permissions migration
Page updated: August 4, 2026
Registry (enterprise)
Custom agents