議事録づくりや文章のチェックのようなスキルは、Claudeが読んで書くだけで完結します。ところが、コミットメッセージを整えるスキルや、テストを実行してから結果を報告するスキルのように、途中でコマンドを実行するスキルもあります。こうしたスキルでは、毎回コマンドの実行前に承認を求められると、スキルにした意味が薄れてしまいます。
allowed-toolsは何をする機能か
Claude Codeのフロントマターにはallowed-toolsというフィールドがあります。公式ドキュメントによれば、このフィールドはスキルを呼び出したターンの間だけ、列挙したツールを承認プロンプトなしで使えるようにする機能です。
書き方は2通りあります。
---
name: commit
description: Stage and commit the current changes
allowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *)
---
またはYAMLのリストとして、次のようにも書けます。
allowed-tools:
- Bash(git add *)
- Bash(git commit *)
Bash(git add *)のように、ツール名のあとに丸括弧でコマンドのパターンを添える書き方が基本です。ここで許可を与えたコマンドだけが、承認なしで実行されます。
列挙したツールを、スキルを呼び出したターンの間だけ承認プロンプトなしで使えるようにする
列挙したツールを、そのスキルが動いている間だけ利用対象から外す
注意
許可は次のメッセージでクリアされる
allowed-toolsで与えた許可は、そのスキルを呼び出したターンにしか効きません。次のメッセージを送った時点で許可はクリアされ、同じスキルをもう一度呼び出せば再び適用されます。「一度承認したら以後ずっと自動」という機能ではありません。
allowed-toolsは、権限を狭める機能ではない
ここが誤解しやすいところです。公式ドキュメントは、allowed-toolsが「どのツールが使えるかを制限するものではない」とはっきり書いています。リストにないツールも、通常どおり呼び出し可能なままです。ただしリストにないツールには、いつもどおりの権限設定(承認を求める・拒否するなど)が引き続き効きます。
つまりallowed-toolsは、指定したツールについて承認の手間を省く機能であって、指定していないツールを封じ込める機能ではありません。「このスキルにはBashしか使わせたくない」という発想で書いても、他のツールが使えなくなるわけではないという点を押さえておく必要があります。
反対に、スキルの実行中だけ特定のツールを取り上げたい場合はdisallowed-toolsを使います。こちらは列挙したツールを、そのスキルが動いている間だけ利用対象から外すフィールドです。
パターンの書き方には落とし穴がある
Bash(git add *)のような書き方は、Claude Codeの権限ルールと同じ記法を使っています。公式ドキュメントのトラブルシューティングでは、Bashの権限ルールについて「実行ファイルそのものではなく、コマンド文字列を照合する」と説明されています。たとえばrmを禁止するルールを書いても、/bin/rmのように別の経路で同じコマンドを呼び出したり、find -deleteのような別のコマンドで同じ結果を起こしたりすると、そのルールはすり抜けます。
同じ記法を使うallowed-toolsのパターンにも、同じ注意が当てはまります。**「このパターンにマッチする文字列だけを許可している」**という前提で書き、想定より広い範囲を許可していないかを見直してください。
本当に守りたい境界線は、別の場所で確保する
ここまで見てきたとおり、allowed-toolsは承認の手間を減らす道具であって、絶対に超えさせたくない境界線を作る道具ではありません。Claude Codeの公式ドキュメントは、CLAUDE.mdと権限設定・フックの役割の違いについて、CLAUDE.mdは「Claudeが良い判断をするための情報」、権限設定とフックは「Claudeの判断にかかわらず制限を強制するもの」だと整理しています。同じ考え方はallowed-toolsにも当てはまります。絶対に自動実行させたくない操作があるなら、権限設定の拒否ルールやフックで止めるのが確実です。allowed-toolsは、あくまで日常的に安全だと分かっている操作の摩擦を減らすために使います。
やってみよう
演習1:自分のスキルにコマンドが必要か考える
これまでのレッスンで考えてきたスキル候補について、実行中にコマンドを打つ必要があるかどうかを考えてください。必要なら、どんなコマンドかを1つ書き出してみましょう。
演習2:allowed-toolsのパターンと、守りたい境界線を分けて書く
演習1で書いたコマンドについて、Bash(コマンド *)の形でallowed-toolsのパターンを書いてみてください。そのうえで、「これだけは絶対に自動実行させたくない」という操作があれば、それはallowed-toolsではなく権限設定やフックで止めるべきだと言葉にしてみましょう。
今日のまとめ
3行で振り返ります。
- allowed-toolsは、スキルを呼び出したターンだけ、指定したツールの承認プロンプトを省く機能
- リストにないツールも使えなくなるわけではなく、通常の権限設定が引き続き効く
- 絶対に超えさせたくない境界線は、allowed-toolsではなく権限設定の拒否ルールやフックで確保する
次のレッスンでは、作ったスキルをチームや組織に共有・配布する方法を扱います。
セルフチェック
1. allowed-toolsフィールドの効果として、公式ドキュメントの説明に合うものはどれですか。
2. allowed-toolsについて、本文で説明した注意点はどれですか。
3. 絶対に自動実行させたくない操作がある場合、本文が勧める対処はどれですか。