Loading image...Kiro

Product

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

For

  • Enterprise
  • Startups
  • Students

Community

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

Resources

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

Social

Site TermsLicenseResponsible AI PolicyLegalPrivacy PolicyCookie Preferences
Kiro
  • Agents
  • Enterprise
  • Pricing
  • Docs
SIGN INDOWNLOADS
Kiro

Get Started

InstallationAuthenticationYour first project

Models

OverviewAvailable modelsReasoning effortAWS GovCloud (US) models

Features

How Kiro worksLocal command sandboxACP integrations
Specs
Steering
Hooks
MCP
Permissions
Custom agents
Workflows
Agent Skills
Powers
Cloud sessionsMemoryCompactionKiroignoreCheckpoints 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 V3
Setup & First Run
Terminal UI
Chat
Fullscreen modeVoice modeHeadless modeACPAuto complete
Experimental
2.x reference

Crew

Quick startInstallationRunning 24/7
Chat
Agent Capabilities
Features
Interfaces
Apps
System & storageConfigurationSecurityTroubleshooting

Web

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

Mobile - Preview

Overview

Commands and Reference

CLI commandsSlash commandsBuilt-in toolsExit codesSettings

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
Deployment optionsSubscribe your teamManage subscriptions
Governance
Monitor and track
SettingsManaged updatesTLS inspection compatibilityBillingIAMSupported regions
AWS GovCloud (US)

Privacy and Security

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

Guides

OverviewRunning Kiro in the cloud
Language support
Learn by playing

Migration

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

Permissions

View as Markdown

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✓✓N/A—
Interactive approval prompts✓✓N/A—
Global + workspace scopes✓✓N/A—
Managed cloud sandbox instead of permission promptsN/AN/A✓—

On Web, the permissions.yaml model and interactive approvals do not apply: the agent runs inside an isolated cloud sandbox instead of prompting per action, so those rows are marked N/A rather than unsupported.

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 (every capability except sandbox_network), builtin (all built-in tools), filesystem (fs_read + fs_write)
Effectsdeny (block always), ask (prompt you), allow (proceed silently), evaluate (Kiro judges the action; the weakest effect, added by the approve-for-me preset and active only when the trust classifier is available)
Prioritydeny > ask > allow > evaluate - a deny rule always wins regardless of scope. sandbox_network host rules are the exception; see Sandbox network rules

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"

Sandbox network rules

The sandbox_network capability applies only when the local command sandbox is active. Its allow and deny rules name the hosts that sandboxed shell commands can reach, and your fs_read and fs_write rules shape which paths those commands can see and write. It is excluded from the all meta-capability.

Host filtering does not use deny-overrides. sandbox_network rules are applied in order and the first rule that matches the host decides, so a specific deny must come before a broader wildcard allow that also matches. Deny-overrides still governs whether the agent may run a tool action. See Local command sandbox for host patterns and network modes.

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, and evaluate).

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.

The parser evaluates flags inside combined short options, so a command such as grep -iP still prompts when one of its flags requires approval. Options that can launch another program are never treated as read-only: tar --use-compress-program and tar --to-command require approval even when the base tar command is trusted.

In Kiro IDE 1.4.51 or later and Kiro CLI V3 sessions, Kiro blocks bash or PowerShell commands it cannot parse well enough to check against your permission rules. It asks the agent to rewrite the command instead of asking you to approve an unchecked command. Commands for cmd.exe still ask for approval. A rule that asks about every shell command still shows its normal prompt when no shell deny rule applies. An unconditional allow or deny rule still decides without parsing. If a valid command remains blocked after a few rewrites, the agent tells you it could not check the command.

Scopes

Permissions are evaluated across multiple scopes. The table lists the scopes you configure or encounter directly; it is not an inventory of every scope the permission engine defines.

ScopeLocationAllowed effects
KiroHardcoded security invariants (cannot be changed by configuration)deny, ask
administrationEnterprise permission policies in managed-settings.jsondeny, ask
user~/.kiro/settings/permissions.yamldeny, ask, allow, evaluate
workspace~/.kiro/workspace-roots/<hash>/permissions.yamldeny, ask, allow, evaluate
agentEmbedded in agent profile (permissions field)deny, ask, allow, evaluate
sessionIn-memory rules from consent decisions during the sessiondeny, ask, allow, evaluate

Rules are evaluated using a deny-overrides algorithm: deny > ask > allow > evaluate. There is no precedence between scopes - the most restrictive effect wins regardless of which scope it came from. evaluate is the effect the approve-for-me preset adds when it is listed under policies: in a user or workspace permissions file; see Policy presets. sandbox_network host filtering is the exception: it applies rules first-match, as described in Sandbox network rules.

Warning

A deny rule in any scope blocks the action regardless of allow rules elsewhere. Be deliberate with deny rules, since no allow rule can override them. For sandbox_network host rules, order decides instead; see Sandbox network rules.

Sub-agents

Kiro checks each sub-agent tool call against the parent session's policy and the sub-agent's own permissions. The stricter result wins:

  • A deny from either policy denies the call.
  • An ask rule in either policy prompts you.
  • If the parent session's policy has no rule for the call, Kiro prompts you, even when the sub-agent's own rules allow it.

A call that the sub-agent's rules don't mention follows the parent session's policy. A sub-agent's allow rules never grant more than the parent session allows. A subagent capability rule only controls whether a sub-agent can start without a prompt. See Sub-agent permissions.

Policy presets

Policy presets are named, composable sets of rules. Every preset except approve-for-me consists only of allow rules. A preset reaches a session by one of two paths, and the path decides its scope:

  • Requested by a client. Any ACP client, including Kiro's own surfaces and compatible third-party integrations such as editor integrations, review bots, and CI harnesses, can request the allow-only presets when it opens a session. Their rules are seeded at session scope and held in memory only.
  • Listed in a permissions file. A preset named under policies: in a user or workspace permissions.yaml is expanded at that file's scope and persists with the file. In Kiro CLI 2.36 or later, this is how the approve for me option under /permissions turns on approve-for-me: it writes the preset to the workspace permissions file.

approve-for-me is the exception to allow-only. It adds an evaluate rule for every capability on top of a bounded set of allow rules, and it depends on Kiro's trust classifier: when the classifier is unavailable, the preset contributes no rules and the session keeps asking. Turn it on with the approve for me option under /permissions in a Kiro CLI V3 session, where that option appears; see Approve for me.

How client-requested presets are applied

An ACP client requests presets in the _meta.kiro.policyPreset field of a session/new or session/load request. Multiple presets can be combined; their rules are merged as a union.

json
{ "_meta": { "kiro": { "policyPreset": ["edit-workspace", "dev-shell"] } } }

Client-requested preset rules are seeded into the session when the client opens it, separately from the rules you configured in permissions.yaml. This is why a session's active rules can include entries you never wrote.

Requesting an unknown preset ID rejects the session request. There is no silent fallback to a default policy.

Info

Client-requested preset rules are session-scope and held in memory only. On a cold session load (a full restart), the client must re-assert the preset. A session that resumes without a full restart keeps its already-seeded rules. A preset listed under policies: in a permissions file is not affected: it is read from the file at that file's scope each time the file loads.

Available presets

Preset IDRules it contributes
allow-allEvery capability except sandbox_network (equivalent to capability: all, effect: allow)
edit-workspacefs_read and fs_write within ./** only
read-workspacefs_read within ./** only
read-allfs_read anywhere, plus web_fetch and web_search
read-only-shellRead-only shell commands: system info plus git, cargo, npm, docker, kubectl, and rustup queries
dev-shellRead-only shell commands (the read-only-shell set) plus git write commands; build tools cargo, npm, bun, yarn; workspace ops mkdir, touch, mv, cp; inspection commands ls, cat, grep, echo
approve-for-meThe edit-workspace and read-only-shell sets, plus an evaluate rule for every capability, so Kiro judges each action that no deny, ask, or allow rule settles. Requires the trust classifier; when it is unavailable, this preset contributes no rules. In Kiro CLI 2.36 or later, choosing approve for me under /permissions in a V3 session lists this preset under policies: in the workspace permissions file, so its rules apply at workspace scope; see Approve for me

Choosing presets for a session

The allow-only presets remove prompts for the operations a session is meant to perform, and everything else keeps the default of asking for approval. Pick the narrowest profile that matches the session's job. approve-for-me is not in this table: it is chosen under /permissions in a Kiro CLI V3 session, which lists it in the workspace permissions file rather than requesting it for one session, and it only takes effect when the trust classifier is available.

Session profilePresetsWhat you get
Code review or auditread-workspaceWorkspace files are read silently. Writes and shell commands still ask, so the session prompts before any change.
Investigation and researchread-allFile reads anywhere on disk, plus web_fetch and web_search, for sessions that trace an issue across code and external documentation without needing write access.
Diagnostics and triageread-workspace + read-only-shellThe agent reads workspace files and queries git, docker, kubectl, and other tool state. Nothing grants a write, so every change still asks.
Autonomous build-and-test loopedit-workspace + dev-shellThe agent edits workspace files, runs git write commands and the standard build tools, and creates or moves files in the workspace without a prompt per action. Writes outside the workspace and unlisted commands still ask.
Disposable sandboxallow-allEvery capability is allowed. Use it where the environment itself is the boundary, such as a container that is discarded after the run.

Each profile is requested the same way: the preset IDs go in the policyPreset array of the session request. A code review bot opens its session with:

json
{ "_meta": { "kiro": { "policyPreset": ["read-workspace"] } } }

A diagnostics session pairs workspace reads with read-only shell queries:

json
{ "_meta": { "kiro": { "policyPreset": ["read-workspace", "read-only-shell"] } } }

A CI harness that edits, builds, and tests combines the two write-capable presets:

json
{ "_meta": { "kiro": { "policyPreset": ["edit-workspace", "dev-shell"] } } }

deny rules and the Kiro scope invariants below still apply regardless of which profile is active.

Presets in embedded and headless clients

The same profiles map onto common integration patterns. An editor integration that embeds Kiro typically requests edit-workspace so in-workspace file edits do not prompt. A code review bot requests read-workspace and nothing more. A CI or evaluation harness driving the agent programmatically combines edit-workspace with dev-shell, then adds its own deny rules for anything the pipeline must never touch.

Warning

Headless execution raises the stakes: when no interactive client is available, every ask is treated as a deny, because the runtime has no interactive channel to deliver the prompt. A headless session can only perform operations that are explicitly allowed, so the presets it requests, plus any configured allow rules, define its entire grant surface.

Trust invariants

Presets extend what a session is allowed to do, but they cannot override higher-precedence rules. The deny-overrides algorithm described in the Scopes section above still applies in full:

  • Kiro-scope hard denies (writes to ~/.kiro/settings/, .kiro/settings/, ~/.kiro/workspace-roots/, .kiroignore, and the other stores listed under Default behavior) block the action regardless of any preset.
  • Kiro-scope ask rules (.git/**, .vscode/**, **/*.code-workspace, and the agents, hooks, workflows, and powers directories under .kiro and ~/.kiro) still prompt, even when a preset grants broad write access.
  • Any deny rule you have configured at the user, workspace, or administration scope wins over a preset allow.
  • The sandbox_network capability is not part of the all meta-capability, so no preset, including allow-all, changes sandbox network gating.

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, not changeable by configuration) enforces:

  • Always denied: writes to ~/.kiro/settings/, .kiro/settings/, and ~/.kiro/workspace-roots/ (prevents the agent from modifying its own permission files), to .kiroignore at any depth (it defines the agent's own read boundary), to the MCP configuration of an installed Power (~/.kiro/powers/installed/<name>/mcp.json), and to Kiro's own state stores (~/.kiro/sandbox-state/, ~/.kiro/web-session/, ~/.kiro/cloud-cache/, ~/.kiro/sandbox-curl/)
  • Always asks: writes to .git/**, .vscode/**, **/*.code-workspace, and the agents, hooks, workflows, and powers directories of both the workspace .kiro and ~/.kiro. These ask in trusted and untrusted workspaces alike, and no allow rule from any scope removes the prompt, with one exception inside the managed cloud sandbox described under Workspace trust.
  • Asks while the workspace is untrusted: writes to .kiro/steering, .kiro/skills, .kiro/extensions, the .kiro/specs directory itself, and any .kiro directory Kiro does not declare, even when a saved rule allows the write. See Workspace trust.

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

Workspace trust

Some agent inputs live inside the repository you open: custom agent profiles in .kiro/agents/, Steering files in .kiro/steering/, workspace MCP server configuration, Skills, and Workflow files. A cloned repository could use them to change how the agent behaves, so Kiro treats a workspace as untrusted until you trust it. Your decision is stored outside the workspace, so a repository cannot change its own trust status.

Until you trust a workspace, Kiro:

  • Does not load the workspace's custom agents, Steering files, MCP server configuration, or Skills.
  • Does not load Workflow files from the workspace, including files reached through a link from your home or cloud recipe directories. Your own home, cloud, bundled, and generated Workflows stay available.
  • Asks before every shell command starts, including background processes, even when a saved or broad rule allows the command. The prompt shows the full command. A matching deny rule still refuses.
  • Asks before every MCP tool call and before every Power activation, content read, or tool call, even when a saved rule or autoApprove allows it, and asks again when a call is retried after MCP authentication or a URL prompt. A matching deny rule still refuses.
  • Asks before writing to .kiro/steering, .kiro/skills, .kiro/extensions, the .kiro/specs directory itself, or any .kiro directory Kiro does not declare, in both the workspace and ~/.kiro, even when a saved rule allows the write. Writes to the agents, hooks, workflows, and powers directories ask in every workspace.
  • Refuses writes to the memory database under ~/.kiro/memories/ and to the agent's session store (~/.kiro/sessions/ by default) without prompting, so an untrusted session cannot rewrite another session's state.
  • Does not let the agent add, change, or delete memories, knowledge bases, or remote learnings. Reading them still works.

Your user, administration, agent, and session rules still apply, and so does the per-workspace store under ~/.kiro/workspace-roots/: it lives outside the repository, so it loads regardless of trust.

Trust changes one tier of .kiro writes and leaves the others alone. The table applies to both the workspace .kiro and ~/.kiro; files under .kiro/specs/ follow your ordinary rules.

Path under .kiroUntrusted workspaceTrusted workspace
steering, skills, extensions, the specs directory itself, any directory Kiro does not declareAsks, even when a saved rule allows the writeFollows your rules
agents, hooks, powers, workflowsAsksAsks, except as described under the fs_write exception below
settingsRefusedRefused

A matching deny rule wins in every row.

One rule lifts the untrusted-only asks for .kiro directories: an fs_write allow rule in your own ~/.kiro/settings/permissions.yaml with no match restriction and no exclude. It does not remove the always-ask paths, does not override a matching ask or deny, and does not load the untrusted workspace inputs listed above. One environment widens that rule: in a trusted workspace inside the managed cloud sandbox that cloud sessions run in, the same unrestricted user-level fs_write allow also lifts the always-ask prompts for .git/**, .vscode/**, **/*.code-workspace, and the agents, hooks, workflows, and powers directories. Outside the cloud sandbox, those paths ask in every workspace.

Trust a workspace in Kiro CLI

In Kiro CLI 2.33 or later, an interactive V3 session shows a Trust this workspace? screen the first time you start Kiro CLI in a folder, before it loads the folder's hooks, agents, MCP servers, steering, workflows, or language server configuration. Non-interactive runs (--no-interactive) and V1 and V2 sessions are not gated: they load workspace configuration without asking, as before. The screen is specific to Kiro CLI.

  1. Start Kiro CLI in the project folder. The screen shows the folder path and warns that the folder can contain hooks, agents, MCP servers, and workflows that run commands on your machine.
  2. Choose Trust, continue to load the folder's configuration and start the session, or Don't trust, exit to leave. Declining exits Kiro CLI without loading anything from the folder and prints Not trusted: <folder>. Kiro exited without loading this folder.
  3. Kiro saves a trusted answer as workspaceTrusted in the per-workspace permissions file under ~/.kiro/workspace-roots/, so the screen appears once per folder. The screen names the exact file.

When the folder is your home directory, the screen notes that its .kiro configuration is your user-level configuration, and the answer lasts for that session only. Trust for your home directory is never saved, so Kiro asks at every launch there.

In Kiro CLI 2.34 or later, pass --trust-workspace to trust the current folder for one V3 launch. The flag skips the prompt and does not save workspaceTrusted, so a later launch asks again unless you previously saved trust for that folder.

To revoke trust, remove the workspaceTrusted line from the file the screen named; the next launch in that folder shows the screen again. To confirm a folder is trusted, start Kiro CLI in it again: the screen does not appear and the session starts with the folder's configuration loaded.

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. Allow and Deny are available for the current invocation. Kiro also shows persistent choices when it can derive a saved rule that will work for the requested command:

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

If Kiro cannot verify a working saved rule, it hides Always allow and Always deny and explains why in the prompt.

When you select Always allow or Always deny, 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). In Kiro IDE, when the window has more than one workspace folder, this choice reads This workspace folder (folder-name), so you can see which folder the rule is saved for. The label does not change how the rule is enforced: shell command rules still apply to the whole session. In Kiro IDE, the choice is also hidden for files and folders outside every workspace folder.
    • 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
Require approval for shell in productioncapability: shell, effect: ask

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 V3 - Permissions migration
Page updated: October 31, 2026
Registry (enterprise)
Custom agents