0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのpermissions.denyでREADMEの書き換えを止める — 読み取り相談を10分で試す

0
Posted at

「Claude Codeにリポジトリを読ませて、まずは説明だけしてほしい。でも、まだファイルは書き換えてほしくない」

最初にAIエージェントを動かすとき、こう感じるのは自然なことやと思います。便利さを確かめる前に、どこまで動くのか分からない。そこが不安なんですよね。

この記事では、Claude Codeのpermissions.denyという権限ルールを1つだけ使います。練習用のREADME.mdを読める状態にしつつ、Claude Code内蔵のEditWriteによる書き換えを拒否します。

最後にStatus: draftがそのまま残っていることを確認できれば成功です。今日やるのは、これだけ。10分ほどで試せます。

更新日: 2026-09-01

この記事が合う人

  • AIエージェントという言葉は聞いたけれど、まだ自分で動かしたことがない
  • Claude Codeへコードを読ませて相談したい
  • 最初からファイル変更まで許すのは少し不安
  • macOS、Linux、またはWSLのターミナルで練習できる

逆に、今回だけ一時的に読み取り相談をしたい人は、後で触れるPlan modeの方が短いです。この記事は「このプロジェクトでは、次回の起動でも同じ拒否ルールを使いたい」ときの最初の一歩です。

先に結論: 置く設定は4行です

練習プロジェクトの.claude/settings.local.jsonへ、次の設定を置きます。

{
  "permissions": {
    "deny": ["Edit", "Write"]
  }
}

denyは「拒否する」という意味です。Editは既存ファイルを編集する内蔵ツール、Writeはファイル内容を書き込む内蔵ツールです。

Claude Codeの公式ドキュメントでは、権限ルールはdenyaskallowの順に評価されます。今回のようにツール名だけをdenyへ入れると、そのツール自体がClaudeへ見えない状態になります。

ここで大事なのは、AIへのお願いではなく、Claude Code側の設定で止めることです。

「ファイルを変更しないでください」という文章は、Claudeが何をしようとするかを導く指示です。一方、permissions.denyはClaude Codeが何を許すかを決める境界です。似ているようで、役割が違います。

用語を30秒でそろえる

この先に出る言葉を、先に短くそろえておきます。

  • AIエージェント: 質問へ答えるだけでなく、ファイルを読んだり、道具を選んだりしながら作業を進めるAI
  • Claude Code: Anthropicが提供する、開発作業向けのAIエージェント
  • CLI: ターミナルで文字を入力して操作する方式
  • ターミナル: コマンドという短い指示を文字で入力するアプリ
  • プロジェクト: 今回Claude Codeに見せるファイルをまとめたフォルダ
  • 権限: AIエージェントに、どの操作を許し、どの操作を止めるかという境界
  • JSON: 設定を波括弧や引用符で書く形式

用語が多く見えますが、実際に作るのはREADMEと設定ファイルの2つだけです。

10分後の成功状態

今回の成功は「Claudeが変更してくれた」ではありません。

  1. Claude CodeへREADME.mdの変更を頼む
  2. EditWriteが使えないため、変更されない
  3. 通常のターミナルでStatus: draftが残っていると確認する

変更されなかったことが、今回の成功です。拒否メッセージの文言はバージョンや応答によって変わりえます。最後は画面の言い回しではなく、ファイルそのものを確認します。

事前準備: Claude Codeをインストールする

すでにclaude --versionでバージョンが表示される人は、この章を飛ばして構いません。

macOS、Linux、WSLでは、通常のターミナルへ次を貼り付けます。WSLはWindows上でLinux環境を動かす仕組みです。

curl -fsSL https://claude.ai/install.sh | bash

Windows PowerShellを使う場合の公式コマンドはこちらです。

irm https://claude.ai/install.ps1 | iex

インストールできたか確認します。

claude --version

バージョン番号と(Claude Code)が表示されれば準備完了です。この記事の手元確認では2.1.251 (Claude Code)を使いました。

初回起動時はログインが求められます。

claude

ブラウザの案内に従ってログインし、起動できたらいったん/exitで終了してください。Claude Codeを利用できるアカウント種別は変わる可能性があるため、最新条件は記事末尾の公式Quickstartで確認してください。

手順1: 練習プロジェクトを作る

ここからのコマンドは、macOS、Linux、WSLの通常ターミナルへ入力します。

最初に、同じ名前の練習フォルダがないか確認します。

test -e ~/claude-permission-practice && echo "すでに存在します" || echo "作成できます"

作成できますと表示された場合だけ、次へ進みます。すでに存在しますと出たら、既存データを上書きしないよう、フォルダ名をclaude-permission-practice-2などへ変えてください。

練習用フォルダと、Claude Code設定用の.claudeフォルダを作ります。

mkdir -p ~/claude-permission-practice/.claude
cd ~/claude-permission-practice

README.mdを作ります。

printf '# Practice\n\nStatus: draft\n' > README.md

内容を確認します。

cat README.md

次の3行が表示されます。

# Practice

Status: draft

このdraftをClaude Codeへreadyに変えるよう頼み、変わらないことを確かめます。

手順2: プロジェクトだけに効く拒否ルールを作る

引き続き、通常ターミナルへ入力します。

cat > .claude/settings.local.json <<'JSON'
{
  "permissions": {
    "deny": ["Edit", "Write"]
  }
}
JSON

このファイル名を分解すると、意味が見えやすくなります。

  • .claude: Claude Code用の設定を置くフォルダ
  • settings: 設定
  • local: 自分のこのプロジェクトだけで使う範囲
  • .json: JSON形式のファイル

公式Settingsでは、.claude/settings.local.jsonは「あなた、このプロジェクト」に適用するプロジェクトローカル設定です。チーム全員へ共有する.claude/settings.jsonとは用途が違います。今回は他の人や他のプロジェクトへ広げないため、localを選びます。

作った設定を読み返します。

cat .claude/settings.local.json

JSONは、引用符やカンマが1文字違うだけでも設定として読めないことがあります。Claude Codeには、インストールや設定を読み取り専用で診断するclaude doctorがあります。

claude doctor

設定ファイルの検証エラーが表示されなければ次へ進みます。なお、claude doctorは修正作業を実行するコマンドではなく、公式Setupで読み取り専用の診断と説明されています。

手順3: Claude CodeへREADMEの変更を頼む

通常ターミナルで、いま練習フォルダにいることを確認します。

pwd

末尾がclaude-permission-practiceなら、そのままClaude Codeを起動します。

claude

ここから入力場所が変わります。次の文章は通常ターミナルのコマンドではなく、起動したClaude Codeの入力欄へ貼り付けます。

README.mdを読み、Status: draftをStatus: readyに変更してください。変更できない場合は、その理由を1文で説明してください。

今回の設定では、Claude Code内蔵のEditWriteが拒否されています。そのため、Claudeは変更を実行できない旨を説明するか、変更できない境界の中で別の提案を返すはずです。

ただし、ここは大事なので正直に書きます。筆者環境ではClaude Code 2.1.251のバージョン、設定JSON、claude doctorまでは確認しましたが、認証が切れていたためモデルの最終応答は動作未確認です。画面の文言を成功条件にはしません。

確認できたら、Claude Code入力欄で終了します。

/exit

手順4: READMEが変わっていないことを確認する

Claude Codeを終了すると、入力場所は通常ターミナルへ戻ります。

次を実行してください。

grep '^Status:' README.md

期待する表示はこちらです。

Status: draft

readyではなくdraftが残っていれば、今回の10分成功です。

拒否メッセージを見るだけで終わらず、実ファイルを確認する。地味ですが、AIエージェントを安心して使い始めるうえで、この確認習慣はかなり効くと思います。

なぜプロンプトだけではなく権限設定を使うのか

たとえば、Claudeへ次のように頼むこともできます。

ファイルは変更せず、読むだけにしてください。

これは良い指示です。ただし、あくまでClaudeが何をしようとするかを導く文章です。

permissions.denyは、Claude Code側でツール利用を拒否します。公式ドキュメントも、プロンプトやCLAUDE.mdはClaudeの行動を導く一方、アクセスを許可・拒否するには/permissions、権限ルール、権限モード、フックを使うと区別しています。

お願いと境界。両方に役割があります。今回は、そのうち境界を1つだけ自分で動かしました。

つまずきポイント

1. claude: command not foundと出る

インストール後のターミナルが古いPATHを見ている可能性があります。いったんターミナルを閉じて開き直し、もう一度確認します。

claude --version

解決しなければ、記事末尾の公式Setupとインストールトラブルシューティングへ進んでください。

2. 通常ターミナルへ日本語の依頼文を入れてしまう

README.mdを読み...という文章は、claudeを起動した後のClaude Code入力欄へ入れます。

迷ったら、入力欄の上にモデル名や作業フォルダが見えるかを確認してください。見えない場合は通常ターミナルの可能性があります。

3. 設定ファイルの場所が違う

今回の配置は次です。

claude-permission-practice/
├── README.md
└── .claude/
    └── settings.local.json

練習プロジェクト直下の.claudeに入っているか確認します。

find . -maxdepth 2 -type f -print

4. JSONのカンマや引用符でエラーになる

JSONではキーと文字列を半角の二重引用符で囲みます。全角の引用符や末尾の余分なカンマは避けてください。

まず記事の4行をそのまま貼り直し、その後に診断します。

claude doctor

5. settings.jsonsettings.local.jsonを取り違える

.claude/settings.jsonは共有プロジェクト設定、.claude/settings.local.jsonは自分のこのプロジェクト向けです。今回は後者を使います。

共有するかどうかは別の判断です。最初の練習では影響範囲を小さくするため、localから始めます。

6. Claudeの返事が想定と違う

モデルは、決まったエラー文だけを返すとは限りません。代替案を説明したり、変更できない理由を別の言葉で返したりします。

そのため、成功判定は返事ではなく次の結果です。

grep '^Status:' README.md

Status: draftが残っているかを見てください。

7. 毎回設定ファイルを作るのは大げさに感じる

その感覚は正しいです。今回だけ読み取り相談をしたいなら、Plan modeで起動する方が短い場合があります。

claude --permission-mode plan

公式PermissionsではPlan modeを、ファイルを読み、読み取り専用のシェルコマンドで探索する一方、ソースファイルは編集しないモードとして説明しています。

この記事の設定が向くのは、同じプロジェクトで複数回、EditWriteを見せない境界を使いたいときです。

この設定の限界

deny: ["Edit", "Write"]だけで、Claude Code全体が完全な読み取り専用になるわけではありません。

今回拒否しているのは、Claude Code内蔵のEditWriteという2つのツールです。Bash、PowerShell、MCPサーバー、プラグインなど、別のツールや外部連携を通じた変更まで一括で拒否する設定ではありません。

また、権限設定は「許可された操作が常に正しい」と保証するものでもありません。大切なプロジェクトでは、Gitの差分確認、バックアップ、隔離環境、組織の管理設定などを組み合わせる必要があります。

最初から完璧な安全設計を全部覚える必要はありません。今日はEditWriteを止め、その結果を自分で確認した。まずは、その1段で十分です。

まとめ

今回使った機能は、Claude Codeのpermissions.denyだけです。

{
  "permissions": {
    "deny": ["Edit", "Write"]
  }
}

この設定を.claude/settings.local.jsonへ置き、READMEの変更を頼み、最後にStatus: draftが残っていることを確認しました。

AIエージェントは、何でも許してから使い始める必要はありません。小さな練習フォルダで、小さな境界を1つ作り、実際に止まるかを見る。そうやって道具の動ける範囲を自分で確かめると、次の一歩がだいぶ軽くなる気がします。

参考リンク

生成AI活用エンジニア&3児のパパ。AI×開発の実践知を毎日発信しています → X

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?