約 4,180 字 · 読むのに 7 分ほど
Claude Code に「このエラーの原因を調べて」と頼むと、AI はログファイルを読みます。そのログに問い合わせの名前や電話番号が入っていれば、それも一緒に AI に送られます。piip は、AI が読む前に個人情報と秘密情報をマスクする Claude Code のスキルです。
AI に調べてもらうと、個人情報も読まれる
Claude Code のようなコーディング AI は、必要だと判断すれば自分でファイルを開きます。原因を調べるためにログを tail し、データの形を見るために CSV を読み、設定を確かめるために .env を開きます。どれも作業としては正しい動きです。
ただ、読んだ内容はすべて AI のモデルに送られます。
- 問い合わせフォームのログに、お客さまの名前・メールアドレス・電話番号・住所
- 決済エラーのログに、カード番号
.envに、データベースのパスワードや API キー
エラーの原因を調べるのに、お客さまの本名は要りません。要るのは「どの処理で、どんな形の値が来て、何が起きたか」です。それなら、AI に渡す前に個人情報だけを伏せればいい。これを自動でやるのが piip です。
piip とは
piip-skills は、個人情報(PII)と秘密情報を検出してマスクする Rust 製のコマンド piip と、それを使う Claude Code のスキルです。フックも付いていて、プラグインとしてまとめて入ります。MIT ライセンスで公開しています。
- 処理はすべて手元のパソコンの中。外部のサービスには送らない
- 日本語に強い:住所、電話番号、マイナンバー、「お名前:」のようなラベル付きの項目、全角の数字や記号
- Claude Code の「フック」で動くので、入れたあとは何もしなくても働く
- Linux、macOS、Windows(Git Bash)の実行ファイルを用意
piip は Claude Code の作業のうち、読む・書く・頼むの 3 か所で働きます。
| 場面 | piip がすること |
|---|---|
| 読む | Read・Grep・Bash の結果を、AI に渡る前にマスクする |
| 書く・送る | マスク済みの値での上書きを止める。外部に送るコマンドに個人情報があれば確認する |
| 頼む | 自分が打ったプロンプトに個人情報があれば、送る前に止める |
特徴 1:AI が読む前にマスクする
Claude Code がファイルを読むと、piip が結果を受け取り、個人情報を伏せてから AI に渡します。試しに、問い合わせフォームのログ(例のために作った架空のデータ)を Claude Code に読ませました。
| ファイルの中身 | AI が受け取った内容 |
|---|---|
| name=”山田 太郎” | name=”山* 太*” |
| email=taro.yamada@example.jp | email=t***@example.jp |
| tel=090-1234-5678 | tel=***-***-5678 |
| card 4532-1234-5678-9014 | card ****-****-****-9014 |
| address=”東京都新宿区西新宿2-8-1″ | address=”東京都***” |
| ip=203.0.113.24 | ip=203.***.***.24 |
| msg=”注文した商品が届きません” | msg=”注文した商品が届きません”(そのまま) |

ポイントは、形と一部は残すことです。メールのドメイン、電話番号の末尾、都道府県、本文のメッセージは残るので、AI は「同じ人から 2 件来ている」「東京からの注文で決済が失敗している」といった調査を続けられます。消えるのは、人を特定できる部分だけです。

- ファイルそのものは書き換えない。マスクするのは AI に渡る内容だけ
- 対象は既定でログ、CSV、JSON、SQL、メール、
.envなど。ソースコードは対象外 cat app.logやtail -f logs/*.logのような Bash コマンドの出力、Grep の検索結果もマスクする- マスクに失敗したときは、内容を渡さない(安全な側に倒す)
- 1 回の処理は数ミリ秒。使っていて待たされることはない
特徴 2:マスクした値で上書きさせない
マスクには一つ落とし穴があります。AI が見ているのは t***@example.jp や [REDACTED] なので、AI がファイルを書き直すと、その伏せ字で本物の値を上書きしてしまうかもしれません。.env のパスワードが [REDACTED] になれば、アプリは動かなくなります。
piip は、そのセッションで AI に見せた伏せ字を覚えておき、Edit・Write・Bash がそれを新しく書き込もうとしたら止めます。覚えておくのはマスク後の形だけで、元の値はどこにも保存しません。マスクしていない部分の編集は、これまでどおりできます。
特徴 3:外に送る前に確認する
AI は curl で API を呼んだり、gh で GitHub に Issue を書いたり、MCP で外部のサービスを操作したりもします。piip は、こうした外部に送るコマンドや MCP ツール、WebFetch の入力に個人情報が入っていたら、実行する前に確認を求めます。たとえば、ログの一部をそのまま Issue に貼ろうとしたときに気づけます。
確認の画面には、マスクした値だけを表示します。設定で「確認」ではなく「拒否」にもできます。
特徴 4:自分が貼ったものも止める
案外多いのが、人間のほうがプロンプトに貼ってしまうことです。「このお客さまからの問い合わせに返信を書いて」と、メールを丸ごと貼ってしまう。piip は、プロンプトに個人情報があると送信を止め、マスクした版を手元にだけ表示します。

- 表示されたマスク済みの文をコピーして送り直せば、そのまま作業を続けられる
- わかったうえで送りたいときは、プロンプトに
#piip-okを付ける - 止めずに警告だけにすることもできる
どれくらい見つけるか
日英の問い合わせ、アクセスログ、アプリのログ、CSV、メール、チャット、.env などを模した評価用のデータ(740 文書、正解 3,398 件)で測りました。
| 種類 | 標準(builtin) | Presidio 併用(hybrid) |
|---|---|---|
| メール、電話、住所、カード、秘密情報、マイナンバーなど | 100% | 100% |
| ラベル付きの名前(お名前:…) | 100% | 100% |
| 文中の名前(担当の佐藤より…) | 0% | 74.9% |
| 全体の再現率 | 83.8% | 97.3% |
| 全体の適合率 | 99.2% | 98.3% |
標準のエンジンは規則(正規表現と検査)で探すので、形の決まった情報は確実に見つけ、誤検出もほとんどありません。一方、文章の中に紛れた名前は苦手です。そこまで必要な場合は、Microsoft の Presidio を手元で動かして併用できます(こちらも外部には送りません)。
なお、評価用のデータは自分で作ったもので、規則の改善にも使いました。実際のデータでは数字はもっと下がると考えてください。
使い方
Claude Code で、次の 2 行を実行します。
/plugin marketplace add benridane/piip-skills
/plugin install piip@piip
Claude Code を再起動すれば、フックが働き始めます。実行ファイルは初回に GitHub Releases から取得し、チェックサムを確かめてから使います。
自動で働くフックのほかに、「このログの個人情報をマスクして」「リポジトリに秘密情報が残っていないか調べて」と頼めば、Claude がスキルとして piip コマンドを使ってくれます。コマンドを直接使うこともできます。
$ piip mask inquiry.log # マスクした内容を表示
$ piip scan . --fail # ディレクトリを調べ、見つかったら失敗で終わる(CI 向け)
対象にするファイルや、確認・拒否の動きは .piip.toml で変えられます。詳しくは README をご覧ください。
気をつけること
- 自動の検出なので、見逃しもマスクしすぎもあります。大事なデータでは、マスクの結果を一度確かめてください
- ソースコードは既定で対象外です。コードの中に書かれた秘密情報は、
piip scanで別に調べてください - AI がフックを通らない方法で読んだ内容(ほかのツールや、画像として読んだものなど)はマスクできません
- 外部への送信の確認は、コマンドに書かれた内容だけを見ます。
curl --data @memo.mdのようにファイルを指定して送る場合、ファイルの中身は調べません。実際に試したときも、AI がこの形で送ろうとしたため確認は出ませんでした - Windows での動作は、まだ確かめていません
まとめ
- コーディング AI は、作業のためにログや CSV や
.envを読む。読んだ個人情報はモデルに送られる - piip は、AI が読む前に個人情報をマスクする。形と一部は残るので、調査はそのまま続けられる
- マスクした値での上書き、外部への送信、プロンプトへの貼り付けも止める
- 処理はすべて手元。Claude Code で 2 行実行すれば入る
