はじめに
Claude Code・Cursor・Codexのようなエージェントに作業を任せると、リポジトリ内の .env や秘密鍵が「エージェントから読める状態か」を意識しないまま進めがちです。そこで、ファイルの中身を開かずに、ファイル名とパスだけで「どのエージェントから読める可能性があるか」を日本語で表示するCLIを作りました。
Claude Codeで .env を読ませない設定そのものは、別記事にまとめています。
Claude Codeに.envを読ませない設定は settings.json の permissions.deny に書く
本記事はその設定が「ちゃんと書けているか」を点検する側の話です。
※ ツールのリポジトリは現在非公開のため、本記事では動作と出力を紹介します。
使い方
Node.js 20以上で動き、追加の依存パッケージはなく、外部通信もしません。
node bin/github-qiita-x.js scan ./調べたいリポジトリ
node bin/github-qiita-x.js scan ./調べたいリポジトリ --json
終了コードは「対象ファイルなし=0」「あり=1」「引数やディレクトリが不正=2」です。.env.example のようなサンプルだけなら INFO 扱いで 0 になります。
何を見ているか
-
検出対象:
.env/.env.*、*.pem*.key*.p12*.pfx、id_rsaid_ed25519id_ecdsa(*.pubは除外)。.git/とnode_modules/は走査せず、シンボリックリンクもたどりません。 -
Claude Code: プロジェクトの
.claude/settings.json・.claude/settings.local.jsonと、ユーザーの~/.claude/settings.json(CLAUDE_CONFIG_DIRがあればそのsettings.json)にあるpermissions.denyのRead(...)ルールと照合します。 -
Cursor: ルートの
.cursorignoreと照合します(完全な保護境界ではない旨も表示)。 -
Codex:
.codex/config.tomlの有無だけを見ます。パス単位の効果は判定せず「読める可能性あり」と表示します。
実行例
2026-10-15、Node.js 20.19.2 で、ダミー値だけを入れた検証用フォルダに対して実行した実際の出力です。
.claude/settings.json に {"permissions":{"deny":["Read(./.env)"]}}、.cursorignore に config/ を書いています。
.env
Claude Code: 拒否設定あり(.claude/settings.json)
Cursor: 除外設定なし → 読める可能性あり
Codex: 設定で防ぐ方法が未確認のため、読める可能性あり
修正例: Cursor: ./.env を .cursorignore に追加
.env.example [サンプル・INFO]
Claude Code: 拒否設定なし → 読める可能性あり
Cursor: 除外設定なし → 読める可能性あり
Codex: 設定で防ぐ方法が未確認のため、読める可能性あり
修正例: Claude Code: "Read(./.env.example)" を permissions.deny に追加
修正例: Cursor: ./.env.example を .cursorignore に追加
(config/server.key の行は省略。この例の終了コードは 1 です)
拒否設定が見つかったときは、どの設定ファイルで拒否されているかを表示し、そのエージェント向けの修正例は出しません。
ホーム側(~/.claude/settings.json)に "Read(./config/server.key)" を書いた場合は、次のように表示されます(同日、同環境で実行)。
config/server.key
Claude Code: 拒否設定あり(~/.claude/settings.json)
Cursor: 除外設定あり(ただし完全ではない可能性)
Codex: 設定で防ぐ方法が未確認のため、読める可能性あり
(以降の行は省略)
誤解しやすいポイント
-
.claudeignoreは公式のアクセス制御設定として記載されていません。 読ませたくないファイルはpermissions.denyのRead(...)で書きます。(出典: Claude Code settings / permissions)このCLIも.claudeignoreを見つけると警告します。 -
Claude Codeの設定は複数の場所にあり、リスト系はマージされます。 優先度は「管理設定 >
--settings>.claude/settings.local.json>.claude/settings.json>~/.claude/settings.json」。permissionsのようなリストは上書きではなくマージされます。(出典: settings の "Settings precedence")リポジトリ側に書いていなくてもホーム側で拒否済みのことがあるため、このCLIは両方を見ます。 -
denyルールはワークスペースを信頼する前から効きます。(出典: settings) -
.cursorignoreは完全な保護境界ではありません。 公式ドキュメントでも、ターミナルやMCPなど経由で読まれうる点に触れています。(出典: Cursor ignore file)筆者は実機では試していません。 - 拒否ルールがあることは、OSレベルで読み取りを防ぐことと同じではありません。 確実に防ぎたい場合は、公式の permissions やサンドボックスに関する説明を確認してください。このCLIが確認するのは「設定にルールがあるか」だけです。筆者は Bash 経由の読み取りを実機では試していません。
- Codexのファイル単位の読み取り制限は、このCLIでは判定していません。 設定は公式の config-advanced / config-reference を参照してください。
安全性
対象ファイルの中身や値は開かず、表示もしません。読むのは設定確認に必要な .claude/settings*.json・ユーザー設定・.cursorignore だけで、.codex/config.toml と .claudeignore は存在のみ確認します。読み取り専用で外部通信もしません。
おわりに
「AIに読ませていいもの」を棚卸しする第一歩として、こういう点検を習慣にするのがおすすめです(筆者の運用上の提案)。VPS側の公開ディレクトリに .env や .git が置かれていないかは、別ツール vps-check の WEB-002 で確認できます。
更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。