Claude Codeは、リポジトリを手元で読み、grepで探し、参照をたどって、コードの構造や処理の流れを日本語で説明できるAnthropic製のコーディングエージェントです。この記事では、既存のソースコードを解析させる手順を、ファイルを書き換えさせない設定と答えの検証方法まで含めて整理します。OSSのPythonライブラリを解析させ、返ってきた行番号を実ソースと突き合わせた実測結果も載せています。
まとめ:Claude Codeでソースコード解析するときの要点
- 仕組み:事前の索引(エンベディング)を作らず、ファイルの一覧・grep・読み込みで、手元のコードを直接たどります。リネーム直後でも古い索引の情報を返すことはありませんが、どこから見ればよいかの手がかりが少ないと、コンテキストを早く使い切ります。
- まず読み取り専用で回す:対話なら
claude --permission-mode plan、スクリプトなら--tools "Read,Grep,Glob"で組み込みの編集ツールとBashを外せます。MCPツールは--toolsの対象外なので、--disallowedTools "mcp__*"を足します。 - 答えは行番号で受け取って照合する:
-pと--output-format json --json-schemaで「ファイル・行・役割」の形に固定すると、sed -nで機械的に確かめられます。itsdangerous 2.2.0で実行すると、14か所すべてが実ソースと一致しました(処理時間は約23秒・推定0.42ドル)。 - 大きなリポジトリは設定で精度が変わる:言語ごとのLSPプラグイン、階層に分けたCLAUDE.md、生成物やvendorを読ませない
permissions.denyの3つが効きます。 - 機密ファイル:
Read(./.env)のdenyで、Readは拒否され、Grepの結果からも外れました。ただしBashのgrep -rには効かないと公式が明記しています。 - 静的解析ツールの代わりにはしない:CIの合否は決まった結果を返すSonarQubeやESLintに任せ、Claude Codeには処理の説明、原因の追跡、指摘の読み解きを任せます。
Claude Codeのコード探索方式:事前索引を使わない検索と読み込み
Anthropicの公式ブログHow Claude Code works in large codebases(2026年5月14日)は、Claude Codeのコードの読み方を「エンジニアと同じ」と説明しています。ファイルシステムをたどり、ファイルを読み、grepで探し、参照を追います。ローカルのCLIは開発者のマシンでファイルを探索し、リポジトリ全体の事前索引や一括アップロードを必要としません。ただし、回答に必要なコードの内容は推論先のAPIへ送信されます。
同じ記事によると、コード全体をエンベディングして検索するRAG型のツールは、索引の更新が開発に追いつかないと、改名済みの関数や削除済みのモジュールを返します。Claude Codeはいまのファイルを読むのでこの問題は起きませんが、どこを見ればよいかの手がかりが要ります。公式も、巨大なコードベースで「あいまいなパターンを全部探して」と頼むと、作業の前にコンテキストウィンドウの上限に当たると書いています。後半で扱う設定は、この手がかりを与えるためのものです。
macOS・Linux・WSLでは、組み込みのGlob・Grepツールは既定で外れており、Bash経由のfindとgrep(同梱のbfsとugrep)で探します(tools reference)。--toolsで名指しすると2つとも使えます。
「Claude Codeのソースコード解析」で、2026年3月にnpmのソースマップから流出したClaude Code自体のソースを調べている方は、Claude Codeのnpmソースコード流出(v2.1.88)とは|ソースマップ混入の原因・経緯と今のnpm版の中身で経緯と現在のnpm版の構成を確認できます。この記事は、Claude Codeを使って自分たちのコードを解析する方法を扱います。
既存コードの全体像をつかむ:起動から最初の質問まで
Claude Codeはチャット版のClaudeと違い、手元のファイルを直接読んでコマンドも実行できます(両者の役割の違いはClaudeとClaude Codeの違い|チャット・Desktop・APIの役割と料金の使い分け)。使うには、Pro・Max・Team・Enterpriseのいずれかのサブスクリプションか、Claude Consoleのアカウントが要ります(認証の公式ドキュメント)。プランごとの金額はClaude Codeの料金プラン比較|Pro・Max・Team・APIの損益分岐と使用上限・支出上限の設定【2026年10月】にまとめています。2026年10月30日時点のnpmの最新版は2.1.312(10月27日公開)で、stableタグは2.1.308です(npmレジストリ)。
プロジェクトの概要を聞く:公式レシピの4ステップ
公式ドキュメントのCommon workflowsは、新しく参加したプロジェクトを理解する手順を次の順で示しています。プロジェクトのルートへ移動し、claudeを起動して、広い質問から始めます。
cd /path/to/project
claude
> give me an overview of this codebase
> explain the main architecture patterns used here
> what are the key data models?
> how is authentication handled?
質問は日本語でかまいません。公式は、広い質問から絞り込むこと、規約やパターンを聞くこと、プロジェクト固有の用語集を作らせることを勧めています。ドメイン用語の多い業務システムでは、用語集を最初に作らせると以降の回答の言い回しがチームとずれにくくなります。
機能の所在と処理経路の調査
特定の機能を探すときは、「どのファイルか」「どう連携するか」「どう流れるか」の順で聞きます。公式の例はfind the files that handle user authentication、how do these authentication files work together?、trace the login process from front-end to databaseです。プロジェクト内の用語で、探したいものを具体的に書くことが推奨されています。
ファイルや範囲がわかっているなら、@src/auth/のように@で指定すると、探す手間を省けます。公式ブログは、ディレクトリ構成から目的の場所が読み取れないリポジトリでの手段としてこの指定を挙げています。
解析中にファイルを書き換えさせない:Plan Modeと読み取り専用ツール
解析だけが目的なら、組み込みの編集ツールを制限して起動します。以下の非対話例の--toolsは組み込みツールだけを制限し、MCPツールは制限しません。MCPも止める場合は--disallowedTools "mcp__*"を追加します。設定済みのフックはツールの制限と別に動くので、何が登録されているかも確認します。対話で使う場合はPlan Modeが向いています。Claudeはファイルを読んで計画を出しますが、承認するまで編集しません。
# 対話:Plan Modeで起動(途中からはShift+Tabで切り替え)
claude --permission-mode plan
# 非対話:読むためのツールだけを渡す(編集とBashを外す)
claude -p "認証の流れを説明して" --tools "Read,Grep,Glob"
Plan Modeが有効な間は、ステータスバーに⏸ plan mode onと表示されます。モードごとの違いと切り替えの注意はClaude Codeのパーミッションモードの違いと設定方法|auto・acceptEdits・bypassPermissionsの使い分けで解説しています。
調べる範囲が広いときは、組み込みのExploreサブエージェントに任せられます。サブエージェントの公式ドキュメントによると、Exploreは「コードベースの検索と解析に最適化された高速な読み取り専用エージェント」で、WriteとEditは使えません。起動時にCLAUDE.mdとgitの状態を読み込まないので、調査を速く安く済ませられます。メイン会話がFableのときは、サブスクリプション、Console、またはANTHROPIC_BASE_URL経由のLLMゲートウェイで使う場合、Exploreはopusエイリアスのモデルで動きます。指示するときはuse a subagent to investigate how our auth system handles token refreshのように頼みます。自作のサブエージェントの作り方はClaude Codeのサブエージェントとは?作り方・設定項目・使い方【v2.1.287対応】を参照してください。
解析結果をJSONで受け取る:itsdangerous 2.2.0で行番号を照合した実測
Claude Codeの説明はもっともらしく読めるため、どこまで正しいかを確かめる手段が要ります。そこで、答えを「ファイル・定義行・シンボル・役割」の形に固定し、行番号を実ソースと機械的に照合できるかを試しました。対象はPythonの署名ライブラリpallets/itsdangerous のタグ2.2.0(src配下のPythonは1,199行)です。非対話モードの公式ドキュメントのとおり、--output-format jsonと--json-schemaを組み合わせると、スキーマに沿った結果がstructured_outputに入ります。
SCHEMA='{"type":"object","properties":{"flow":{"type":"array","items":{"type":"object",
"properties":{"file":{"type":"string"},"line":{"type":"integer"},"symbol":{"type":"string"},
"role":{"type":"string"}},"required":["file","line","symbol","role"]}},
"expiry_check":{"type":"string"}},"required":["flow","expiry_check"]}'
claude -p "URLSafeTimedSerializer の loads() が呼ばれてから、署名の検証と有効期限の判定が終わるまでの呼び出しの流れを、入口から順に file・line・symbol・役割で答えてください。推測で埋めず、ソースを読んで確かめた行だけを書くこと。" \
--model sonnet --tools "Read,Grep,Glob" \
--output-format json --json-schema "$SCHEMA" \
--max-budget-usd 1.5 --no-session-persistence > run1.json
jq '.structured_output.flow[] | "\(.file):\(.line) \(.symbol)"' run1.json
掲載コマンドは、タグ2.2.0をチェックアウトしたitsdangerousのリポジトリ直下で、jqを導入済みのBashまたはzshから実行します。Claude Code 2.1.302で、2026年10月30日に実行した結果は次のとおりです。
| 項目 | 結果 |
|---|---|
| 実行モデル | claude-sonnet-5-5 |
| ターン数・処理時間 | 8ターン・約23秒(duration_ms) |
| 推定費用(total_cost_usd) | 0.42ドル |
| 返った関連シンボル | 10件(クラス・メソッド・例外) |
| 照合した行番号 | 14か所 |
| 実ソースと一致 | 14か所(全一致) |
Claudeは、URLSafeTimedSerializerが独自のloadsを持たず、timed.py185行目のTimedSerializer.loadsが実際の入口になることを、継承関係から示しました。期限の判定はtimed.py138行目のif max_age is not None:から始まり、141行目でage > max_age、148行目でage < 0(タイムスタンプが未来)のときにSignatureExpiredを送出すると答えています。さらに、この判定には署名が正しいときにしか到達しないことと、213行目のexcept SignatureExpired:が次の鍵を試さずに再送出することも挙げました。すべてsed -n '138p' src/itsdangerous/timed.pyのように1行ずつ引いて確かめています。
行番号つきで答えさせれば、該当行の取得はコマンドで行えます。ただし、呼び出し順、分岐条件、役割の説明が正しいかは、周辺コードの読解やテストで別に確認する必要があります。また、小さなライブラリ1つでの結果なので、大規模なリポジトリでも同じ精度が出るとは言えません。0.42ドルはClaude Code自身の推定値で、公式も請求額とずれうると注記しています。オンボーディング資料やレビューの下書きを作らせるなら、行番号の照合はスクリプトに任せ、人は説明の中身の確認に時間を使う分担が現実的です。
大規模リポジトリで精度を上げる設定
公式ドキュメントSet up Claude Code in a monorepo or large codebaseと前述の公式ブログが挙げる対策のうち、解析の精度に直接効くものを4つに絞りました。
LSPプラグインによるシンボル単位の参照検索
よくある関数名をgrepすると数千件ヒットし、Claudeはどれが目的のものかを確かめるためにファイルを開き続けます。言語サーバー(LSP)をつなぐと、同じシンボルへの参照だけが返るので、読む前に絞り込みが済みます。公式ブログは、C・C++のナビゲーションを安定させるためにClaude Codeの展開前にLSPを全社導入した企業の例を挙げ、多言語のコードベースでは特に投資効果が高いとしています。
Code intelligence pluginsの公式ドキュメントによると、公式マーケットプレイスにはC/C++(clangd)、C#、Go、Java、Kotlin、Lua、PHP、Python(Pyright)、Ruby、Rust、Swift、TypeScript/JavaScriptなどのプラグインがあります。プラグインに言語サーバー本体は含まれないので、先にバイナリを入れます。
# 1. 言語サーバー本体を入れる(TypeScriptの例)
npm install -g typescript-language-server typescript
# 2. Claude Codeのプロンプトでプラグインを入れる
/plugin install typescript-lsp@claude-plugins-official
診断機能を確認する場合は、変更を破棄できる検証用ブランチやサンプルプロジェクトで型エラーを入れ、診断の表示を確認してから元に戻します。編集の下にFound N new diagnostic issues in M filesと出れば、言語サーバーが動いています。出なければ/pluginのErrorsタブにExecutable not found in $PATHが出ていないかを見ます。Web版などのクラウドセッションでは言語サーバーが起動せず、LSPツールは無効のままです。シンボル単位の解析を別の仕組みで足したい場合は、MCPサーバーのSerenaも選択肢になります(SerenaをClaude Code・Codex・Gemini CLIに統合する実践ガイド ― 設定・ツール運用・要否判断)。
CLAUDE.mdの階層化と起動ディレクトリの選択
CLAUDE.mdは毎回のセッションで自動的に読まれる説明ファイルです。公式ドキュメントは1ファイル200行未満を目安にしています。起動したディレクトリより上にあるCLAUDE.mdは起動時に読まれ、下のサブディレクトリにあるものは、Claudeがそのディレクトリのファイルを読んだときに初めて読み込まれます。
公式ブログは、モノレポではルートでなく作業するサブディレクトリで起動することを勧めています。上の階層のCLAUDE.mdは自動で読まれるので、全体の説明は失われません。ルートには各トップレベルフォルダの役割を1行ずつ書いた目次と注意点だけを置き、詳細とテスト・lintのコマンドは各サブディレクトリのCLAUDE.mdに書きます。1サービスの修正で全テストを回して時間切れになる事態を防げます。
生成コード・vendorを読ませない:permissions.deny
Claudeの検索は既定で.gitignoreを守るので、node_modules/やdist/がそこに書いてあれば結果に出ません。コミットされているvendorのSDKや生成コードを外すには、.claude/settings.jsonにReadのdenyルールを書いてコミットします。公式の例は次のとおりです。
{
"permissions": {
"deny": [
"Read(./**/dist/**/*)",
"Read(./**/build/**/*)",
"Read(./**/*.generated.*)",
"Read(./**/vendor/**/*)"
]
}
}
末尾を/**でなく/**/*にしているのは、ディレクトリの中身だけを拒否し、ls distのような一覧の確認は残すためです。相対パスのルールは、リポジトリのルートでなくセッションを起動したディレクトリを基準に解釈されます。サブディレクトリから起動する場合、共有の.claude/settings.jsonは親ディレクトリから継承されないので、起動するパッケージごとの.claude/に置きます。自分だけに効かせるルート直下の.claude/settings.local.jsonに書く場合は、//で始まる絶対パスで指定します。権限のリストは設定ファイル間で結合され、denyはallowより先に評価される(permissionsの公式ドキュメント)ため、共有設定のdenyは個人のローカル設定では解除できません。生成コードを読む必要がある場合は、共有設定側で拒否対象を見直します。
コンテキスト使用量の確認と計画の保持
大きなリポジトリでは、読んだファイルがそのままコンテキストを埋めていきます。/contextで何がコンテキストを占めているかを色分けで表示でき、/compactでここまでの会話を要約して空きを作れます(コマンド一覧)。複数のパッケージにまたがる変更を解析するときは、先にPlan Modeで計画をファイルに書かせておくと、要約(コンパクト)のたびに計画ファイルが再注入されるため、長いセッションでも方針が失われません。
機密ファイルとデータの扱い:.envの読み取り拒否の実測
.envのような機密ファイルを読ませない設定が効くかを確かめるため、先ほどのitsdangerousのリポジトリにダミーの.envを置き、.claude/settings.jsonに"deny": ["Read(./.env)", "Read(./.env.*)"]を書いて実行しました。この.envは.gitignoreの対象外なので、結果はdenyルールだけの効果です。
| 試したこと | 結果 |
|---|---|
| Readで.envを表示させる | 拒否(permission_denialsに記録) |
| Grepでダミーの値を全体検索 | ヒットなし(.envが結果から外れた) |
| 同じ依頼でのREADME.md | 通常どおり読めた |
Readの拒否では、Claudeは「File is in a directory that is denied by your permission settings.」という理由を示し、別の方法で読もうとはしませんでした。ただし、公式ドキュメントは限界も明記しています。denyはBashのcatやgrepに拒否パスが引数として渡った場合も止めますが、Bashのgrep -rやfindでディレクトリごと検索した結果には拒否したファイルも含まれます。ファイルを自分で開く子プロセスも止められません。Grepツールの除外も「ベストエフォート」とされています。秘密情報は、denyに頼る前にリポジトリから外すのが原則です。権限ルールとサンドボックスを組み合わせた守り方はClaude Codeのセキュリティ設定|権限ルール・サンドボックス・管理設定で守る実装手順【2026年10月】で扱っています。
送ったコードの扱いはプランで変わります。公式のデータ利用ポリシーによると、Free・Pro・Maxでは、モデル改善への利用を許可する設定がオンのときにデータが学習に使われ、保持期間はオンで5年、オフで30日です。Team・Enterprise・APIなどの商用条件では、Developer Partner Programなどで明示的に提供しない限り学習に使われず、保持期間は標準で30日です。Zero Data Retentionは標準のEnterpriseプランには含まれず、組織ごとに審査のうえ有効化されます。手元のマシンにも、セッションの記録が~/.claude/projects/に平文で30日間残ります(cleanupPeriodDaysで変更できます)。社外秘のコードを解析させるなら、送信してよいかを組織で決めたうえで、学習に使われない商用条件のプランで使います。
バグ調査とレビューに使う:スタックトレースから/security-reviewまで
バグの原因調査では、エラーを再現するコマンドを最初に渡すのが公式の推奨です。I'm seeing an error when I run npm testのように伝え、修正案を複数出させてから選んだものを適用させます。毎回起きるのか時々なのかも伝えます。解析だけで止めるなら、修正案までをPlan Modeで行います。
差分のレビューには組み込みのコマンドがあります(コマンド一覧)。
| コマンド・機能 | 対象 | 使えるプラン・条件 |
|---|---|---|
| /code-review(別名 /review) | 今の差分・PR番号・ブランチ | 全プラン |
| /code-review ultra | クラウドでの複数エージェントのレビュー | Pro・Maxは3回無料、以降は追加利用枠 |
| /security-review | originの既定ブランチとの差分 | Pro・Max・API(originのリモートが必要) |
| Code Review(マネージド) | GitHubのPRに行単位でコメント | Team・Enterprise |
/security-reviewは、インジェクション、認証の不備、データの露出などを差分から探します。Code Reviewは複数のエージェントが変更と周辺コードを読み、検証の段階で誤検知を落としてから重大度順にコメントします。PRを承認もブロックもしないので、マージの判断はチームに残ります。公式は「指摘がゼロでもコードに誤りや脆弱性がないことを意味しない」と注記しています。GitHub上で@claudeに作業させる仕組みはClaude Code Actionとは?GitHubで動く仕組みとできないこと・Code Reviewとの違いで比べています。
静的解析ツールとの役割分担:SonarQube・ESLintによる合否判定
静的解析ツールは同じコードに同じ結果を返すので、CIの合否判定に使えます。Claude Codeは、どこから呼ばれるのか、指摘をどう直すのかを、周辺のコードを読んで説明できます。
| 観点 | 静的解析ツール | Claude Code |
|---|---|---|
| 結果の再現性 | 同じ入力に同じ結果 | 実行ごとに変わりうる |
| CIの合否 | 向く(品質ゲート) | 向かない |
| 処理の流れの説明 | 問題に至る経路を表示可能 | 自然言語で説明可能 |
| 指摘の理由と直し方 | ルール説明・修正候補・自動修正 | コードに即した説明・修正提案 |
| 網羅性の保証 | 一般には保証しない | 保証しない |
おすすめの分け方は、合否はツール、読み解きはClaude Codeです。SonarQubeの品質ゲートやESLintをCIの関門に置き、Claude Codeにはその指摘の原因と影響範囲を調べさせます。公式ブログも、lintやフォーマットのような自動チェックは、Claudeに指示を覚えさせるよりフックで決定的に実行するほうが一貫した結果になると書いています(フックの設定はClaude Code Hooksとは?全33イベント一覧とsettings.jsonの設定方法)。静的解析で見つけられる欠陥の種類は静的解析とは?検出できる欠陥と静的解析ツールの選び方|Coverity・cppcheckを比較、SonarQubeの品質ゲートはSonarQube(ソナーキューブ)とは?できること・料金・使い方と品質ゲートの設定【2026年10月】で解説しています。
Claude Codeでの解析を見送る場面
次の条件に当てはまるなら、Claude Codeに解析を任せる前に、別の手段か準備を優先します。
- 網羅性の証明が要る監査:「この脆弱性パターンが全箇所で無い」ことを示す必要がある場合、静的解析やSASTの結果だけでは不十分です。検査対象、ルールの検出限界、除外設定を明示し、監査要件に応じた追加検証を行います。Claude Codeの「見つからなかった」は不在の証明になりません。
- 手がかりなしで巨大なリポジトリ全体を探させる:公式が挙げる失敗パターンです。CLAUDE.mdの目次も、LSPも、範囲の指定もないまま全体を探させると、作業の前にコンテキストの上限に当たります。
- gitでないバージョン管理や、数十万フォルダ規模のレガシー資産:公式ブログは、階層型のCLAUDE.mdでも対応しきれない例外として挙げています。
- 社外に出せないコード:Claude Codeは回答に必要なコードを推論先のAPIへ送ります。社外送信が禁止されているコードは、プランにかかわらず入力しません。利用する場合は、契約条件・送信先・保持設定を確認し、組織から送信の承認を得たコードだけを対象にします。
反対に、仕様書が残っていない既存システムの処理の流れを把握したい、移行前に依存関係を洗い出したいといった用途では、Claude Codeに処理の説明や依存関係の調査を任せ、その結果をソースと照合する進め方が候補になります。古いシステムの解析から移行計画まで外部に任せたい場合は、一僧のシステムマイグレーション・リプレイスでもご相談を受けています。
よくある質問
Claude Codeとは何ですか?読み方は「クラウドコード」ですか?
Anthropicが提供する、ターミナルやIDEで動くエージェント型のコーディングツールです。読み方は「クロードコード」で、「クラウドコード」「cloud code」と書かれることがありますが、名前はAIモデルのClaude(クロード)から来ています。インストールから初日の設定まではClaude Codeの使い方|インストールから権限・CLAUDE.md設定、初日の進め方までで解説しています。
「Claude Codeのソースコード解析」は流出したソースの話ですか?
2つの意味で使われます。2026年3月31日に、npm版2.1.88に含まれたソースマップからClaude Code自体のTypeScriptソースが流出し、その構造を調べた解析資料が多数公開されました。この記事は、Claude Codeを使って自分のコードを解析する方法を扱っています。流出の経緯はClaude Codeのnpmソースコード流出(v2.1.88)とは|ソースマップ混入の原因・経緯と今のnpm版の中身を参照してください。
Claude Codeは無料で使えますか?
無料プランでは使えません。Pro・Max・Team・Enterpriseのサブスクリプションか、Claude Consoleのアカウント(API従量課金)でログインします。Amazon Bedrock、Google CloudのAgent Platform、Microsoft Foundryからも使えます。
解析させたソースコードはAIの学習に使われますか?
Team・Enterprise・APIなどの商用条件では、明示的に提供しない限り学習に使われません。Free・Pro・Maxでは、モデル改善への利用を許可する設定がオンのときに学習に使われます。保持期間は、商用の標準で30日、個人プランで設定がオンなら5年、オフなら30日です。
どのくらいの規模のコードまで解析できますか?
公式ブログは、数百万行のモノレポや数十年続くレガシーシステムでの本番利用を挙げています。ただし、一度に読めるのはコンテキストウィンドウに入る分だけで、何行まで、という上限で決まるわけではありません。大きなリポジトリでは、サブディレクトリから起動する、LSPプラグインを入れる、生成物をdenyで外す、調査をExploreサブエージェントに任せる、といった設定で読む量を減らします。