Loading image...Kiro
  • CLI
  • IDE
  • Web
  • Mobile
  • Enterprise
  • Pricing
  • Docs
SIGN INDOWNLOADS
Loading image...Kiro
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
  1. Docs
  2. IDE
  3. Chat
  4. Permissions

Permissions


Overview

Info

Permissions are new in IDE 1.0. If you're upgrading from 0.x, see What's new in IDE 1.0 for what changed.

A single, unified permission model for everything the agent does. Write one rule to allow npm * commands across every session, or deny .env reads and have every tool respect it simultaneously. The visual consent flow builds your policy as you work: approve or deny from the prompt, choose a pattern, pick a scope, and you're done.

Rule structure

Each rule has four fields:

FieldDescriptionRequired
capabilityThe operation type being controlledYes
matchGlob patterns the resource must matchNo (defaults to all)
excludeGlob patterns that exempt a resource from the ruleNo
effectdeny, ask, or allowYes

Effects resolve by restrictiveness: deny > ask > allow. A more permissive rule can never override a more restrictive one.

Where rules live

ScopeLocationAllowed effects
User~/.kiro/settings/permissions.yamldeny, ask, allow
Workspace~/.kiro/workspace-roots/<hash>/permissions.yamldeny, ask, allow

Additional scopes are managed by the system:

ScopePurposeAllowed effects
KiroHardcoded security invariants (cannot be overridden)deny, ask
AdministrationEnterprise/MDM-managed policy (enterprise plans only)deny, ask
SessionIn-memory rules from consent decisions you make in the IDEdeny, ask, allow

Workspace permissions are stored per-user outside the repository at ~/.kiro/workspace-roots/<hash(workspaceRoot)>/. A cloned repo cannot inject permission rules.

IDE consent flow

When a tool call evaluates to ask, the IDE shows a permission prompt at the top of the chat panel. You have four immediate options:

ButtonWhat it does
AllowPermit this single invocation
Always allowOpen the persistence dialog to save an allow rule
DenyBlock this single invocation
Always denyOpen the persistence dialog to save a deny rule

Persisting decisions

When you click "Always allow" or "Always deny", the prompt expands to show two additional controls:

Pattern: The glob pattern for the rule. The IDE auto-suggests a pattern based on the command (e.g., git add * for a git add invocation). You can customize this to be more or less specific.

Apply to: Where the rule is saved:

ScopeWhat it means
All workspacesSaved to ~/.kiro/settings/permissions.yaml, applies everywhere
This workspaceSaved to ~/.kiro/workspace-roots/<hash>/permissions.yaml, applies only in this project
This sessionRemembered in memory until the session ends

Click "Always allow" (or "Always deny") to confirm. The rule takes effect immediately and you won't be prompted again for matching operations in the selected scope.

How patterns work in the UI

The pattern dropdown suggests a generalized version of the specific command. For example:

  • Exact command git add contents/docs/ becomes pattern git add *
  • Exact path .env.local becomes pattern .env* or **/.env*

You can select the suggested pattern or edit it to be more restrictive (matching only specific subcommands) or more permissive (matching broader operations).

Example configuration

Create ~/.kiro/settings/permissions.yaml:

yaml
rules: - capability: shell effect: allow match: - git * - npm * - npx * - capability: mcp effect: allow - capability: fs_read effect: allow - capability: fs_write effect: allow match: - src/** - tests/**

Default behavior

Without any configuration, the default agent policy allows:

  • fs_read on ./**: read any file in the workspace
  • shell for common read-only commands (git status, git log, git diff, etc.)
  • Utility tools (diagnostics, knowledge, etc.)

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.

Available capabilities

CapabilityWhat it controls
fs_readReading files, listing directories, searching
fs_writeWriting, editing, deleting files
filesystemShorthand for fs_read + fs_write
shellExecuting commands
web_fetchFetching URLs
web_searchWeb search
mcpMCP server tool calls (pattern: server/tool)
subagentSubagent delegation
skillSkills activation
powerPowers activation and tool calls
diagnosticsDiagnostics tools
contextContext and steering tools
allEvery capability (meta)
builtinAll built-in tools (meta)

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, 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" # Allow a specific MCP server - capability: mcp effect: allow match: - "my-server/*"

Shell-specific behavior

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.

Learn more

For more on how permissions work with hooks and custom agents, see those pages.

Page updated: June 24, 2026
Vibe vs. Spec
Dockable chat