メインコンテンツまでスキップ

Claude Codeとは

この章ではClaude Codeについて、AIエージェントとしての仕組みから理解できるよう、ステップバイステップで解説します。

本ドキュメントで記載しているトピックの詳細については、各トピック毎にリンクを掲載しています。

1. AI エージェントとしての Claude Code

AI エージェントとは

Claude Codeは、Anthropic社が提供する、ソフトウェア開発タスクを支援するためのAIエージェントです。開発者が指示した内容を理解し、コードベースを自律的に編集したり、自動テストを実行した結果を自身で分析し適切な改修を実施したり、といった行動を取ることができます。

2025年9月現在ではAnthropic社が提供するClaude Code以外にも、OpenAI社が提供するCodexや、Google社が提供するGemini CLIなど、多くのAIエージェントがソフトウェア開発者に活用されています。

このように既に活用されているAIエージェントですが、そもそもAIエージェントとはどのような仕組みを指す言葉なのでしょうか。

Artificial Intelligence: A Modern Approachによる定義では、「エージェントとは、環境を認識し、目標を達成するために自律的に行動する存在」とされています。ここで言う環境とは、AIエージェントが働きかける場所のことを指します。例えば、ファイルシステムやインターネットのようなデジタル空間や、車の中といった物理空間を指します。

Claude Codeのようなコーディングエージェントを考える場合、物理空間は含めません。また、単に環境を認識するだけで良いのではなく、環境を認識した上で、環境自体にも作用を加える(ファイルなどに変更を加える)機能も必要です。

そのため、ここではAIエージェントを 「目標に向けて環境と相互作用しながらタスクをこなす知能システムのこと」 とします。

この定義は、本ドキュメントを執筆しているメンバーも執筆に関わっている現場で活用するための AI エージェント実践入門でも採用した定義です。

claude_code_01 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

図では「行動」によって環境に働きかけた結果や、ユーザからの入力を「知覚」として受け付けます。そして、AIエージェントが保持している「メモリ」と「知覚」を「LLM」に入力し、その結果「行動」が出力として得られます。この「行動」を「環境」に適用し、また得られた結果が「知覚」として受け付けられることになります。

(このようなループを「エージェントループ」と呼ぶことがあります)

Claude CodeのAIエージェントとしての位置付け

この定義を踏まえると、Claude Codeは 「コードベースを環境として動作する AI エージェント」 と整理することができます。

claude_code_02 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

Claude Codeでは「環境」からの入力は「プロンプト」として受け付けられます。これまでのユーザからの入力やツールの実行結果は「コンテキスト」として保持され、「プロンプト」と「コンテキスト」はLLM(Anthropic Claude)に入力されます。LLMは次に実行する「ツール」を推論し、出力します。最後に、ツールを実行することで、環境に作用を及ぼします。

このように、環境から情報を受け取り、推論を経て環境に作用するエージェントループを繰り返すのが、Claude Codeの基本的な仕組みです。

2. 環境に働きかけるための「ツール」

Claude Codeはツールを選択し続けるAI

先ほどのClaude Codeのエージェントループ図では、環境への働きかけには必ず「ツール」を経由していました。

Claude Codeでは下図のように、ベースツールとしてデフォルトで選択できるツールが提供されています。ユーザからの指示を達成するために、この中のいずれかのツールを選択する行動を取ります。

claude_code_03 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

つまり、Claude Codeは「プロンプト」と「コンテキスト」を入力として、ツールを選択し続けるAIエージェントなのです。

claude_code_04 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

Claude Codeで利用できるツール一覧

各ツールでできることは次の表の通りです。デフォルトでは、Claude Codeはこれらのツールを選択しながらタスクを遂行していきます。

ツール名説明
Bash環境でシェルコマンドを実行
Edit特定のファイルに対象を絞った編集を行う
Globパターンマッチングに基づいてファイルを検索
Grepファイル内容のパターンを検索
LSファイルとディレクトリを一覧表示
MultiEdit単一ファイルに対して複数の編集をアトミックに実行
NotebookEditJupyter ノートブックセルを変更
NotebookReadJupyter ノートブックの内容を読み取り表示
Readファイルの内容を読み取り
Task複雑な多段階タスクを処理するサブエージェントを実行
TodoWrite構造化されたタスクリストを作成・管理
WebFetch指定された URL からコンテンツを取得
WebSearchドメインフィルタリング付きで Web 検索を実行
Writeファイルを作成または上書き

ツールを拡張するための「MCP」

MCP(Model Context Protocol)は、エージェントが利用できるツールを拡張するためのプロトコルです。Claude Codeでは、MCPを利用して、選択できるツールを拡張することができます。

Context7Playwrightのように配布されているものもありますが、FastMCPといった仕組みを使えば自身で開発することも可能です。

claude_code_06 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

例えば開発標準のドキュメントなどをClaude Codeに読ませようとした場合、いちいちReadツールで1件ずつ読ませていたのでは、効率が悪いです。その場合、関連するドキュメントを検索して参照するMCPを独自開発すれば、Claude Codeの実行ステップを減らすことができます。

Claude Codeは実行ステップが多くなればなるほど、ステップの記録にコンテキストを消費してしまうため、指示追従性が悪くなる傾向にあります。 実行効率の分析の際には、Claude Codeの実行ログを、コンテキストサイズの大きいLLMに分析してもらうと、短時間で良い分析を得ることができます。筆者らのプロジェクトでは、ログ分析の際、入力に1Mトークン利用できる Gemini 2.5 Pro を活用しています。

備考

MCP(Model Context Protocol)の詳細な解説は以下のドキュメントを参照してください。

3. ツール実行をプログラマブルに制御する「フック」

コード生成タスクでは、既に環境に整備されているデータベーススキーマをClaude Codeが変更しないよう、制御したいシーンがあります。

このような場合、CLAUDE.mdなどに禁止事項として明記する手段も有効ですが、最終的に判断するのはLLM次第なので、必ず守られるとは限りません。

そこで利用するのが「フック」です。フックを利用することで、任意のタイミングにおいてルールベースでClaude Codeの行動を制御することができます。

例えばPreToolUseフックでは、Claude Codeのツール選択内容を引数にとり、スクリプトで正規表現などを利用して、ツール利用の許可や拒否を自動的に実行することができます。先の例で言えば、.sql形式のファイルを作らせないことにより、データベーススキーマの変更を強制的に禁止させたりすることができます。

claude_code_05 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

フックには次のタイプがあります。これらのフックを使い分けながら、ルールベースでClaude Codeを制御します。

フックタイプ説明
PreToolUseツール呼び出しの前に実行(ブロック可能)
PostToolUseツール呼び出し完了後に実行
UserPromptSubmitユーザがプロンプトを送信したときに、Claude が処理する前に実行
NotificationClaude Codeが通知を送信するときに実行
StopClaude Codeが応答を終了するときに実行
SubagentStopサブエージェントタスクが完了するときに実行
PreCompactClaude Codeがコンパクト操作を実行しようとする前に実行
SessionStartClaude Codeが新しいセッションを開始するか既存のセッションを再開するときに実行
SessionEndClaude Codeセッションが終了するときに実行

比較的よく使われるフックは、PreToolUseNotificationStopです。

PreToolUseは、ツールの呼び出し前に、不正な行動をしないか事前チェックするために使用されます。これは先ほど.sqlファイルの作成を抑制する例でご紹介しました。

NotificationStopはClaude Codeの動作が終了したときに呼び出されるので、ユーザ(自分自身)に通知を送る際に利用されることが多いです。OSの通知や音声で作業の完了を通知すると、複数ウィンドウでClaude Codeを利用している場合に便利です。

備考

フックの詳細な解説は以下のドキュメントを参照してください。

4. 詳細なプロンプトを入力しやすくする「スラッシュコマンド」

Claude Codeにまとまった作業をさせる場合は、可能な限り詳細な手順をClaude Codeに伝える必要があります。しかし毎回大量のプロンプトを入力することは、現実的ではありません。また実際の開発では、まず実装のプランニングを行って欲しい、ある資料を参照しながらトラブルシューティングを行って欲しい、といったClaude Codeへの依頼をある程度パターン化することができます。

このようなパターン化した依頼に対して、Claude Codeでは「スラッシュコマンド(カスタムコマンド)」として事前定義することができます。特に、作業Aをやったあとに作業Bを行い、必要があれば作業Cを行う、といったワークフロー型の作業を実施させる場合に便利です。

claude_code_07 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

このようなパターン化したフロー(コマンド)は、チームで共有するようにすると、チームの生産性を向上させることができます。

ただ、ゼロからコマンドを整備していくのは大変なので、既に公開されている既存のコマンド集を参考にすることが近道です。日本の事例では、クラスメソッド社が公開しているTsumikiというフレームワークがあります。TDDベースで開発を進められるようにコマンドが用意されています。

また、海外で人気なのがSuperClaudeというフレームワークです。こちらはコマンドもさることながら、後述するサブエージェント機能も駆使したつくりになっており、Claude Codeを発展的に利用していくための参考になります。

備考

スラッシュコマンド(カスタムコマンド)の詳細な解説は以下のドキュメントを参照してください。

5. プロンプトやツール実行履歴を保持する「コンテキスト」

ここまで「コンテキスト」という言葉が複数回登場してきました。「コンテキスト」とは、Claude Codeが保持する「記憶(メモリ)」を意味すると考えてください。

公式にどの程度の容量がコンテキストの容量として確保されているかは明言されていませんが、Claude Codeが保持できるコンテキストの容量には限りがあります。

コンテキストはCLAUDE.mdをロードしたり、ファイルをReadしたり、Bashによるコマンド実行を行ったり、これまで行ってきたあらゆる動作の記録を行うために消費されます。Claude Codeは、このコンテキストを参照することで、これまで自身が何をしてきたのかを把握するのです。

ところで、先ほどコンテキストの容量には限りがあると言いました。コンテキストの保存量が一定のしきい値を超えると、Claude Codeではコンテキストの自動圧縮(auto-compaction)が実行されます。

claude_code_08 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

可能な限り、これまでの経緯が失われないように圧縮されますが、やはりある程度のデータが消えてしまうことは否めません。そのため、いたずらに自動圧縮を繰り返させることは得策ではありません。このようなケースで、上手くコンテキストを扱うためには、次節で紹介する「サブエージェント」を活用します。

参考:入力トークン量によってLLMの性能が変化する現象は「Context Rot」として知られています。LLMはモデルによって入力上限が設定されていますが、実際にパフォーマンスを発揮するのは入力上限トークンよりも、もっと小さいトークンを入力した場合に限ります。Claude Codeにおけるコンテキスト上限も、Context Rotを意識したものになっていると推測されるため、Claudeモデルの上限トークンよりも低く設定されていると推測しています。

備考

コンテキストエンジニアリングの詳細な解説は以下のドキュメントを参照してください。

6. コンテキストエンジニアリングのための「サブエージェント」

エージェントは様々なファイルを参照しながらタスクを実行していきますが、単一のエージェントでは保持できるコンテキスト量に限界があります。この限界を乗り越えるための仕組みが「サブエージェント」です。

サブエージェントとは、親エージェント(claudeコマンドで呼び出されているエージェント)が、他エージェント(サブエージェント)に処理を委譲する仕組みのことです。Claude Codeでは親エージェントがサブエージェントに「プロンプト」を入力することで、サブエージェントにエージェンティックな処理を実行させることができます。

claude_code_09 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

サブエージェントがなぜコンテキストエンジニアリングに使えるのかと言うと、エージェントの持つコンテキストは、親エージェント、サブエージェントそれぞれ個別に保有することができるためです。

例えばJavaのテスト実行時には大量のログが流れます。親エージェントが実行すると、コンテキストがテストログに食い潰されてしまうため、このようなときはサブエージェントを利用すると、親エージェントのコンテキストが汚染されずに済みます。大量にファイルを読み込んだり、試験実行時に大量のログが流れたりするような場合、サブエージェントに分割すると、上手くコンテキストをマネジメントすることができます。

一点注意したいのが、親エージェントとサブエージェントとは 相互にコンテキストを共有できない 、ということです。例えばサブエージェントにコード実装をやらせようとすると、親エージェントが持っているコンテキストを継承できないため、コンテキストを踏まえた実装を実施させることができません。

この制約を踏まえると、サブエージェントに実タスクを実行させることは得策ではありません(上手くタスクを遂行できません)。既に生成された成果物をチェックさせたり、様々なファイルを読み込んだ上で適切な方策を親エージェントに連携するような、計画タスクを中心に担当させるのが良いでしょう。

また、サブエージェントでたくさんの作業をさせたとしても、親エージェントに返ってくるのは端的なメッセージのみです。例えば「設計書レビュー結果」だったり、「障害調査結果」といったレポートを作業ログとして生成させるようにし、その情報をエージェントが相互に参照できるように設計すると、エージェント同士のコラボレーションをワークさせることができます。

claude_code_10 ©株式会社ジェネラティブエージェンツ / はじめてのClaude Code ※引用画像は本サイト利用規約に基づく自由な使用、複製、翻案等の対象外です。

備考

サブエージェントの詳細な解説は以下のドキュメントを参照してください。