Agent skill

Tool Permission System Design

by simbajigege in simbajigege/book2skills

Guides designing a layered permission pipeline for agent tools that decides which calls are allowed, need confirmation or are denied, with scopes and hooks.

Apache-2.0Auto-check passedAI & LLM Engineering

SKILL.md written in Chinese; this summary is our English description.

Install Tool Permission System Design

skills CLI
$ npx skills add simbajigege/book2skills --skill tool-permission-system -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install simbajigege/book2skills tool-permission-system --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/simbajigege/book2skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/tool-permission-system .claude/skills/tool-permission-system && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tool-permission-system
GitHub stars
183
Token cost
~2.1k tokens
SKILL.md length
256 words
Files
11 (incl. references)
Skills in repo
37
Repo updated
First seen
Licence
Apache-2.0

At a glance

Guides designing a layered permission pipeline for agent tools that decides which calls are allowed, need confirmation or are denied, with scopes and hooks.

  • Works in 6 steps: 定义三种决策行为 → 建立分层规则来源 → 实现权限决策函数 → …
  • Building an agent that must auto-allow, confirm or deny tool calls
  • SKILL.md covers Core Idea, Workflow, Required Decisions and Minimal Pattern, plus 2 more sections
  • Runs TypeScript scripts from its folder

What it does

This skill explains how to build a permission pipeline that runs before every agent tool call and settles on one of three outcomes: allow, ask the user, or deny. Rules come from layers with a fixed priority, from enterprise policy settings that users cannot override down through user, project and session scopes, and each rule names a tool or a tool with content. Deny rules are a hard veto checked first.

Wrapper modes change the outcome after the pipeline: dontAsk turns every ask into a deny for background agents, auto sends asks to an AI classifier, and headless runs permission-request hooks first and denies when none answers. Tools declare safety properties such as read-only, destructive and concurrency-safe with fail-closed defaults, and a tool's own checkPermissions sits between the general deny and allow rules. References include TypeScript files on dangerous patterns, denial tracking and permission types, plus hook and pipeline docs and example settings. Parts of the text are in Chinese.

When your agent uses it

  • Building an agent that must auto-allow, confirm or deny tool calls
  • Designing allow and deny rules across enterprise, user and project scopes
  • Adding hooks that can approve or block tool calls
  • Defining fail-closed safety flags on tools

Example prompts

  • “Design a permission pipeline for my agent's shell and file tools with allow, ask and deny rules.”
  • “Add a headless mode that denies any tool call that would normally prompt the user.”
  • “Lay out the settings layers so enterprise deny rules cannot be overridden by project config.”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. 定义三种决策行为
  2. 建立分层规则来源
  3. 实现权限决策函数
  4. 为每个工具定义安全属性接口(fail-closed 默认值)
  5. 实现 Hook 系统(可选但推荐)
  6. 实现 Denial 追踪(AI 分类器场景)

What it can do on your machine

Read from SKILL.md and the folder at commit e5ba66c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (TypeScript), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tool Permission System Design loads about 2.1k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 128 tokens; SKILL.md has 256 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~128
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~10k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from simbajigege/book2skills at commit e5ba66c, republished under its Apache-2.0 licence (© simbajigege). 256 words, ~2,062 tokens.

Download SKILL.mdSave it as .claude/skills/tool-permission-system/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
tool-permission-system
description
Design and implement a layered, configurable permission/safety system for agent tools. Use this skill when building an agent that needs to control which tool calls are auto-allowed, which require user confirmation, and which are denied — especially when the system must be configurable across multiple scopes (project/user/enterprise) and extensible via hooks. Triggers on: "权限系统", "工具安全", "tool permission", "permission system", "tool safety", "allow/deny rules", "hook system", "构建安全机制".

Tool Permission System

Core Idea

Every time an agent calls a tool, a permission pipeline runs before execution. This pipeline is the single place that decides: auto-allow, ask the user, or deny. The pipeline is layered — different stakeholders (enterprise admin, user, project team, session) can each contribute rules, with higher layers overriding lower ones.

Tool call request
  ↓
[硬否决] Deny rules → immediate deny
  ↓
[强制确认] Ask rules → force prompt (even in bypass mode)
  ↓
[工具自身] Tool's checkPermissions() → tool-specific logic
  ↓
[安全绕过免疫] Safety checks (.git/, .claude/, shell configs) → prompt, immune to bypass
  ↓
[模式快速通过] Bypass / acceptEdits mode → immediate allow
  ↓
[白名单] Allow rules → immediate allow
  ↓
[默认] passthrough → prompt user (ask)

外层包装(作用于整条流水线之后):

  • dontAsk 模式:把所有 ask 转为 deny(用于无交互的后台 agent)
  • auto 模式:把所有 ask 转给 AI 分类器判断,而不是打断用户
  • headless 模式:先跑 PermissionRequest hooks,hooks 没回应就自动 deny

Workflow

1. 定义三种决策行为
typescript
type PermissionBehavior = 'allow' | 'deny' | 'ask'

type PermissionDecision =
  | { behavior: 'allow'; updatedInput?: unknown; decisionReason?: DecisionReason }
  | { behavior: 'ask';   message: string; suggestions?: PermissionUpdate[] }
  | { behavior: 'deny';  message: string; decisionReason: DecisionReason }
2. 建立分层规则来源

规则来源按优先级从高到低排列:

policySettings    ← 企业管理员,用户不可覆盖
userSettings      ← 用户全局 (~/.agent/settings.json)
projectSettings   ← 项目级 (.agent/settings.json,可提交 git)
localSettings     ← 本地私有 (.agent/settings.local.json)
cliArg            ← 启动参数
command           ← 运行时命令
session           ← 当次会话临时

每条规则的格式:ToolName 或 ToolName(content)。

3. 实现权限决策函数
typescript
async function hasPermission(tool, input, context): Promise<PermissionDecision> {
  // Step 1: deny rules (优先级最高,含企业强制)
  const denyRule = findMatchingRule(context.denyRules, tool, input)
  if (denyRule) return { behavior: 'deny', message: '...', decisionReason: { type: 'rule', rule: denyRule } }

  // Step 2: ask rules (强制弹框,绕过模式也无法跳过)
  const askRule = findMatchingRule(context.askRules, tool, input)
  if (askRule) return { behavior: 'ask', message: '...' }

  // Step 3: 工具自身的 checkPermissions()
  const toolResult = await tool.checkPermissions(input, context)
  if (toolResult.behavior === 'deny') return toolResult
  if (toolResult.behavior === 'ask' && toolResult.decisionReason?.type === 'rule') return toolResult  // ask rule 免疫 bypass
  if (toolResult.behavior === 'ask' && toolResult.decisionReason?.type === 'safetyCheck') return toolResult  // 安全检查免疫 bypass

  // Step 4: bypass 模式快速通过
  if (context.mode === 'bypassPermissions') return { behavior: 'allow', updatedInput: input }

  // Step 5: allow rules 白名单
  const allowRule = findMatchingRule(context.allowRules, tool, input)
  if (allowRule) return { behavior: 'allow', updatedInput: input }

  // Step 6: 默认转 ask
  return { behavior: 'ask', message: `Agent requested to use ${tool.name}` }
}
4. 为每个工具定义安全属性接口(fail-closed 默认值)

工具与权限系统的接合点是工具接口上的一组安全属性。关键设计:所有属性都遵循失败关闭(fail-closed)——开发者不声明时,系统按"最保守"假设处理,必须主动声明"我是安全的"才放宽。

typescript
// 工厂函数用 TOOL_DEFAULTS 填充未声明的属性
const TOOL_DEFAULTS = {
  isEnabled:         () => true,
  isConcurrencySafe: () => false,   // 默认不并发(怕数据竞争)
  isReadOnly:        () => false,   // 默认假设会写入
  isDestructive:     () => false,   // 默认假设不可逆操作要谨慎
  checkPermissions:  (input) => ({ behavior: 'allow', updatedInput: input }), // 默认交给中央权限系统
}
function buildTool(def) { return { ...TOOL_DEFAULTS, ...def } }
属性返回谁来问 / 影响什么
isReadOnly(input)boolean权限系统:只读操作可绕过部分限制
isDestructive(input)boolean权限系统:不可逆操作需更严格确认
isConcurrencySafe(input)booleanAgent Loop:能否与其他工具并发执行(默认 false → 串行)
checkPermissions(input, ctx)PermissionResult权限系统:工具专属权限逻辑(流水线 1c)
validateInput(input, ctx)ValidationResultAgent Loop:执行前的输入合法性校验

checkPermissions 在流水线里的位置是"夹心结构":通用 deny/ask 规则在它之前(且 bypass 也拦不住),通用 allow 白名单在它之后。所以工具自检既挡不住企业 deny,也不必重复实现通用 allow——只管工具特有的逻辑:

typescript
class MyTool implements Tool {
  isReadOnly = () => false
  isConcurrencySafe = () => false

  async checkPermissions(input, context): Promise<PermissionResult> {
    // 检查工具特定规则(如 Bash 检查具体命令前缀)
    const allowRules = getRuleContentsForTool(context, this, 'allow')
    if (allowRules.has(getCommandPrefix(input.command))) {
      return { behavior: 'allow' }
    }

    // 检查危险路径(命中后 type:'safetyCheck' → bypass 也拦不住,见下方说明)
    if (isDangerousPath(input.path)) {
      return {
        behavior: 'ask',
        message: '...',
        decisionReason: { type: 'safetyCheck', reason: '...', classifierApprovable: false }
      }
    }

    return { behavior: 'passthrough', message: '...' }  // 没意见 → 交给外层
  }
}

危险路径黑名单(safetyCheck)是一份硬编码的敏感文件/目录清单,即使 bypass / acceptEdits / 配了 allow 规则也强制弹框,防两类攻击:① 代码执行(.git/ hooks、.bashrc/.zshrc 等 shell 启动脚本、.vscode/.idea 任务配置);② AI 改自己的护栏(.claude/、.mcp.json、.claude.json —— agent 不能通过"正常编辑文件"给自己提权)。完整清单见 references/dangerous-patterns.ts。

5. 实现 Hook 系统(可选但推荐)

Hook 让用户/企业在工具生命周期各节点插入自定义逻辑:

typescript
// 配置格式(settings.json)
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "MyTool",          // 可选,工具名过滤
      "hooks": [{
        "type": "command",          // command | prompt | agent | http
        "command": "check-safety.sh $TOOL_INPUT"
      }]
    }],
    "PostToolUse": [{
      "matcher": "FileEdit",
      "hooks": [{ "type": "command", "command": "prettier --write $FILE_PATH" }]
    }]
  }
}

Hook 执行结果影响权限决策:

  • exit 0 → 通过
  • exit 2 → block(工具不执行)
  • stdout 包含 JSON {"action": "allow"} → 覆盖决策
6. 实现 Denial 追踪(AI 分类器场景)

当使用 AI 分类器自动判断权限时,需要 circuit breaker 防止分类器过于严格:

typescript
// 连续拒绝 3 次或累计拒绝 20 次 → 回退到人工确认
const DENIAL_LIMITS = { maxConsecutive: 3, maxTotal: 20 }

function shouldFallback(state: DenialTrackingState): boolean {
  return (
    state.consecutiveDenials >= DENIAL_LIMITS.maxConsecutive ||
    state.totalDenials >= DENIAL_LIMITS.maxTotal
  )
}

Required Decisions

设计时必须明确的三个问题:

  1. 哪些操作永远不需要确认? → 放入 allow rules(如只读操作)
  2. 哪些操作永远需要确认,不可绕过? → 用 decisionReason.type === 'safetyCheck' 标记
  3. 无人值守场景(CI/后台 agent)怎么处理? → shouldAvoidPermissionPrompts = true + 跑 hooks + 自动 deny

Minimal Pattern

typescript
// 最简实现:三层规则 + 工具自检
type Rule = { toolName: string; content?: string; behavior: 'allow' | 'deny' | 'ask' }

type PermissionContext = {
  mode: 'default' | 'bypassPermissions' | 'acceptEdits'
  allowRules: Rule[]
  denyRules: Rule[]
  askRules: Rule[]
}

async function checkPermission(toolName: string, input: unknown, ctx: PermissionContext) {
  if (ctx.denyRules.some(r => matches(r, toolName, input))) return 'deny'
  if (ctx.askRules.some(r => matches(r, toolName, input))) return 'ask'
  if (ctx.mode === 'bypassPermissions') return 'allow'
  if (ctx.allowRules.some(r => matches(r, toolName, input))) return 'allow'
  return 'ask'  // default: prompt
}

Boundaries

This skill owns:

  • 权限决策流水线的设计与实现
  • 分层规则来源(policySettings → session)的优先级架构
  • 工具级安全属性接口设计(isReadOnly / isDestructive / isConcurrencySafe / checkPermissions + fail-closed 默认值)
  • Hook 系统的配置格式和生命周期事件
  • AI 分类器 + Denial 追踪的 circuit breaker 模式
  • 危险操作硬编码黑名单的设计原则

This skill does not own:

  • 具体工具的业务逻辑(只关注权限接口)
  • UI 确认弹框的实现(只关注决策结果)
  • 用户认证/身份校验(不同于工具权限)
  • AI 分类器的具体 prompt 工程

When More Detail Is Needed

  • 完整 TypeScript 类型定义 → references/permission-types.ts
  • 决策流水线带注释的详细实现 → references/permission-pipeline.md
  • Denial 追踪 circuit breaker 完整代码 → references/denial-tracking.ts
  • Hook 系统架构与所有事件类型 → references/hook-system.md
  • settings.json 配置完整示例 → references/settings-examples.json

© simbajigege, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files (references) in skills/tool-permission-system of simbajigege/book2skills.

  • SKILL.md
  • LICENSE
  • README.md
  • agents/openai.yaml
  • references/dangerous-patterns.ts
  • references/denial-tracking.ts
  • references/hook-system.md
  • references/permission-pipeline.md
  • references/permission-types.ts
  • references/settings-examples.json
  • tool-permission-system.zip

Open the folder on GitHubat commit e5ba66c

Compare with similar skills

Tool Permission System Design next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tool Permission System Design compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tool Permission System Design this skillsimbajigege/book2skills183—~2.1kAutomated safety check: PassApache-2.0
Sponsio Agent Safety SetupSponsioLabs/Sponsio454—~12kAutomated safety check: PassApache-2.0
Trigger.dev Agent Patternspapermark/papermark9.2k—~2kAutomated safety check: PassCustom licence
Add Example AgentGetBindu/Bindu10k—~1.1kAutomated safety check: NotesCustom licence
Failproof AI SDK IntegrationFailproofAI/failproofai5.3k—~6kAutomated safety check: PassCustom licence
Agent Squad for TypeScript2FastLabs/agent-squad7.8k—~4.3kAutomated safety check: PassApache-2.0

Similar skills

  • Sponsio Agent Safety Setup

    SponsioLabs/Sponsio

    Installs, tunes and enforces Sponsio contracts that block unsafe tool calls in LLM agents, covering setup, auditing, observe mode and flipping to enforce.

    454 GitHub stars~12k tokensUpdated yesterday
    AI & LLM EngineeringAuto-check passed
  • Trigger.dev Agent Patterns

    papermark/papermark

    Patterns for building LLM agents on Trigger.dev tasks: prompt chaining, routing, parallel workers, orchestrator-workers, evaluator loops and human approval gates.

    9.2k GitHub stars~2k tokensUpdated 1 mo ago
    AI & LLM EngineeringAuto-check passed
  • Add Example Agent

    GetBindu/Bindu

    Add a new self-contained example agent under examples/. An agent skill from GetBindu/Bindu.

    10k GitHub stars~1.1k tokensUpdated 1 mo ago
    AI & LLM EngineeringAuto-check: notes
  • Failproof AI SDK Integration

    FailproofAI/failproofai

    Helps instrument a custom Python or TypeScript agent to record events for Failproof AI, verify what gets written, and run an evaluator worker that scores the runs.

    5.3k GitHub stars~6k tokensUpdated 4 days ago
    AI & LLM EngineeringAuto-check passed
  • Agent Squad for TypeScript

    2FastLabs/agent-squad

    Guide to building Node.js and TypeScript apps on the agent-squad package: orchestrator, agent types, classifier routing, storage, retrievers and MCP tools.

    7.8k GitHub stars~4.3k tokensUpdated 3 days ago
    AI & LLM EngineeringAuto-check passed
  • CLI To JS

    millionco/cli-to-js

    A skill your agent uses when wrapping CLI binaries in JavaScript, automating shell workflows in TypeScript, composing multiple CLIs into scripts, or building agent tool-use.

    410 GitHub stars~1.1k tokensUpdated 5 mo ago
    AI & LLM EngineeringAuto-check passed

More from simbajigege/book2skills

All 37 skills in this repo
  • MEMORY.md Restructuring

    simbajigege/book2skills

    Reorganizes an overgrown MEMORY.md into a short pointer index plus separate topic files, and fixes or deletes outdated memories instead of archiving them.

    183 GitHub stars~2.4k tokensUpdated 1 mo ago
    Auto-check passed
  • Compact Memory Implementation

    simbajigege/book2skills

    A developer guide to adding compact memory to an agent: when to trigger compaction, how to fork a compactor sub-agent, what the summary holds, and how to restore it.

    183 GitHub stars~2.5k tokensUpdated 1 mo ago
    Auto-check passed
  • Semantic Line-Art SVG Diagrams

    simbajigege/book2skills

    Turns text, screenshots, or existing diagrams into minimal, accessible line-art SVGs for teaching material, with an optional Mermaid relationship spec.

    183 GitHub stars~2.5k tokensUpdated 1 mo ago
    Auto-check passed
  • Fail-Closed Agent Tool Builder

    simbajigege/book2skills

    Helps define agent tools with a fail-closed pattern: one class holding name, schema, security flags and a validate, permission and call execution chain.

    183 GitHub stars~2k tokensUpdated 1 mo ago
    Auto-check passed
  • LLM Query Loop Implementation

    simbajigege/book2skills

    Implements a production-style agent loop in your own AI product, with tool calling, tool results fed back, exit conditions and budget guards.

    183 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check passed
  • Analyzing Financial Reports

    simbajigege/book2skills

    Analyzes Chinese public company financial statements (balance sheet, income statement, cash flow) to assess asset quality, profit authenticity, cash flow health, solvency, and overall investment…

    183 GitHub stars~930 tokensUpdated 1 mo ago
    Auto-check passed

Works with

Questions about Tool Permission System Design

What does Tool Permission System Design do?

Guides designing a layered permission pipeline for agent tools that decides which calls are allowed, need confirmation or are denied, with scopes and hooks. This skill explains how to build a permission pipeline that runs before every agent tool call and settles on one of three outcomes: allow, ask the user, or deny. Rules come from layers with a fixed priority, from enterprise policy settings that users cannot override down through user, project and session scopes, and each rule names a tool or a tool with content.

When should I use Tool Permission System Design?

Tool Permission System Design fits situations like: building an agent that must auto-allow, confirm or deny tool calls; designing allow and deny rules across enterprise, user and project scopes; adding hooks that can approve or block tool calls; defining fail-closed safety flags on tools.

How do I install Tool Permission System Design in Claude Code?

Run `npx skills add simbajigege/book2skills --skill tool-permission-system -a claude-code`. Or copy the skill folder (skills/tool-permission-system in simbajigege/book2skills) into .claude/skills/tool-permission-system in your project. Claude Code loads it when a task matches its description.

How do I install Tool Permission System Design in Codex?

Run `npx skills add simbajigege/book2skills --skill tool-permission-system -a codex`. Or copy the skill folder (skills/tool-permission-system in simbajigege/book2skills) into .agents/skills/tool-permission-system in your project. Codex loads it when a task matches its description.

Can I use Tool Permission System Design in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add simbajigege/book2skills --skill tool-permission-system -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tool-permission-system, .gemini/skills/tool-permission-system, .github/skills/tool-permission-system and .opencode/skills/tool-permission-system in your project.

What does Tool Permission System Design need to run?

Going by SKILL.md and its folder, Tool Permission System Design needs TypeScript for the scripts in its folder.

Does Tool Permission System Design access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Tool Permission System Design safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Tool Permission System Design use?

Tool Permission System Design is published under the Apache-2.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tool Permission System Design use?

About 2.1k tokens (SKILL.md is roughly 8.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8k tokens, read only when the agent opens those files.

What are the alternatives to Tool Permission System Design?

Skills that share tags, products or a category with Tool Permission System Design: Sponsio Agent Safety Setup (SponsioLabs/Sponsio, 454 stars), Trigger.dev Agent Patterns (papermark/papermark, 9.2k stars), Add Example Agent (GetBindu/Bindu, 10k stars) and Failproof AI SDK Integration (FailproofAI/failproofai, 5.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tool Permission System Design?

simbajigege (a GitHub user) maintains it in simbajigege/book2skills, which has 183 GitHub stars. The repository holds 37 skills in this directory. The repository was last updated on August 26, 2026.

Source: simbajigege/book2skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.