メモリツールを使用すると、Claudeはメモリファイルのディレクトリ内で会話をまたいで情報を保存・取得できます。Claudeはセッション間で永続化されるファイルを作成、読み取り、更新、削除でき、すべてをコンテキストウィンドウに保持することなく、時間をかけて知識を蓄積できます。
メモリは「just-in-time context retrieval」(ジャストインタイムのコンテキスト取得)をサポートします。関連するすべての情報を事前に読み込むのではなく、エージェントは学習した内容をメモリファイルに記録し、必要に応じてそれらを読み戻します。これにより、アクティブなコンテキストを現在のタスクに集中させることができます。これは、そうしなければコンテキストウィンドウを圧迫してしまう長時間実行セッションにとって重要です。より広範なパターンについては、Effective context engineeringを参照してください。
メモリツールはクライアントサイドで動作します。Claudeがファイル操作をリクエストし、アプリケーションがそれらを実行します。データの保存場所と保存方法は、独自のインフラストラクチャを通じて制御できます。
この機能に関するフィードバックは、フィードバックフォームからお寄せください。
この機能はZero Data Retention(ZDR)の対象です。組織がZDR契約を締結している場合、この機能を通じて送信されたデータは、APIレスポンスが返された後に保存されることはありません。
メモリツールが有効になっている場合、Claudeはタスクを開始する前に自動的にメモリディレクトリを確認します。作業を進めながら、Claudeは学習した内容を/memories配下のファイルに保存し、後の会話でそれらを読み戻して以前の作業を継続します。
メモリツールはクライアントサイドであるため、Claudeはメモリ操作をリクエストするだけです。アプリケーションは、制御下にあるストレージに対して各リクエストを実行し、結果をtool_resultブロックで返します(ツール呼び出しの処理を参照)。/memoriesパスは、ハンドラーがユーザーごとのディレクトリやデータベース内のキーなどの実際のストレージにマッピングするプレフィックスです。メモリは完全にアプリケーション内に存在します。後の会話が同じtoolsエントリを送信し、ハンドラーが同じストアを提供する場合、その会話は同じメモリから継続されます。セキュリティのため、すべてのメモリ操作を/memoriesディレクトリに制限してください(パストラバーサル保護を参照)。
典型的なインタラクションは次のようになります。
1. ユーザーリクエスト:
"Help me respond to this customer service ticket."2. Claudeがメモリディレクトリを確認:
"I'll help you respond to the customer service ticket. Let me check my memory for any previous context."Claudeがメモリツールを呼び出します。
{
"type": "tool_use",
"id": "toolu_01C4D5E6F7G8H9I0J1K2L3M4",
"name": "memory",
"input": {
"command": "view",
"path": "/memories"
}
}3. アプリケーションがディレクトリの内容を返す:
{
"type": "tool_result",
"tool_use_id": "toolu_01C4D5E6F7G8H9I0J1K2L3M4",
"content": "Here're the files and directories up to 2 levels deep in /memories, excluding hidden items and node_modules:\n4.0K\t/memories\n1.5K\t/memories/customer_service_guidelines.xml\n2.0K\t/memories/refund_policies.xml"
}4. Claudeが関連ファイルを読み取る:
{
"type": "tool_use",
"id": "toolu_01D5E6F7G8H9I0J1K2L3M4N5",
"name": "memory",
"input": {
"command": "view",
"path": "/memories/customer_service_guidelines.xml"
}
}5. アプリケーションがファイルの内容を返す:
{
"type": "tool_result",
"tool_use_id": "toolu_01D5E6F7G8H9I0J1K2L3M4N5",
"content": "Here's the content of /memories/customer_service_guidelines.xml with line numbers:\n 1\t<guidelines>\n 2\t<addressing_customers>\n 3\t- Always address customers by their first name\n 4\t- Use empathetic language\n..."
}6. Claudeがメモリを使用して支援する:
"Based on your customer service guidelines, I can help you craft a response. Please share the ticket details..."メモリツールは、すべてのClaude 4以降のモデルで利用できます。Anthropic提供ツールの完全なリストについては、ツールリファレンスを参照してください。
メモリツールはMessages APIで一般提供されており、ベータヘッダーは不要です。使用するには次の2つのステップが必要です。
toolsエントリ{"type": "memory_20250818", "name": "memory"}が設定のすべてです。nameはmemoryでなければならず、Anthropic提供ツールには入力スキーマを定義しません。/memories外のパスを拒否する必要があるため、作成する前にパストラバーサル保護をお読みください。client = anthropic.Anthropic()
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=2048,
messages=[
{
"role": "user",
"content": "Help me respond to this customer service ticket.",
}
],
tools=[{"type": "memory_20250818", "name": "memory"}],
)
print(message)前述のようなリクエストに対するClaudeの応答は、view /memoriesなどのメモリ操作をリクエストするtool_useブロックで終わります。アプリケーションはその操作を実行し、結果をtool_resultブロックで返してから、Claudeが続行できるように会話を送り返します。これは標準的なツール使用ループです。
4つのSDKは、ツールインターフェースとループを処理するメモリツールヘルパーを提供しています。ディスク上のファイル、データベース、クラウドストレージ、暗号化ファイルなど、独自のストレージでメモリをバックアップするには、BetaAbstractMemoryToolをサブクラス化する(PythonおよびC#)、betaMemoryToolを使用する(TypeScript)、またはBetaMemoryToolHandlerを実装します(Java)。PythonとTypeScriptには、すぐに使えるローカルファイルシステム実装であるBetaLocalFilesystemMemoryToolも付属しています。メモリツール自体は一般提供されていますが、ヘルパーとツールランナーのインターフェースは各SDKのベータ名前空間にあります。GoとRubyのSDKにはメモリヘルパーがないため、それらの例ではツール使用ループを自前で実行し、PHPはハンドラークロージャを汎用のBetaRunnableToolでラップします。これら3つはすべてインメモリストアを使用しており、独自のストレージに置き換えてください。
import anthropic
from anthropic.tools import BetaLocalFilesystemMemoryTool
client = anthropic.Anthropic()
memory = BetaLocalFilesystemMemoryTool(base_path="./memory")
runner = client.beta.messages.tool_runner(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Remember that customer Acme Corp prefers email follow-ups.",
}
],
tools=[memory],
)
final_message = runner.until_done()
print(final_message.content)Go、PHP、Rubyの例にあるインメモリストアは、例を自己完結型に保つためのものです。それぞれがtool_useブロックのinput内のcommandフィールドでディスパッチし、ツールコマンドで説明されている文字列を返します。本番環境のハンドラーには、これらのデモ用ストアが省略しているパス検証も必要です。SDK自体の完全な例については、以下を参照してください。
クライアントサイドの実装では、以下のコマンドを処理する必要があります。これらの仕様は推奨される動作と戻り値の文字列を説明しています。Claudeはツール結果に含まれるテキストをそのまま読み取るため、アプリケーションの必要に応じて異なる文字列を返すこともできます。
ディレクトリの内容、またはオプションの行範囲を指定したファイルの内容を表示します。
{
"command": "view",
"path": "/memories/notes.txt",
"view_range": [1, 10]
}view_rangeはオプションで、テキストファイルの表示に適用されます。[start_line, end_line]はそれらの行を返し、[start_line, -1]はstart_lineからファイルの末尾までのすべてを返します。
ディレクトリの場合: ファイルとディレクトリをサイズとともに表示するリストを返します。
Here're the files and directories up to 2 levels deep in {path}, excluding hidden items and node_modules:
{size}\t{path}
{size}\t{path}/{filename1}
{size}\t{path}/{filename2}5.5K、1.2M).で始まるファイル)とnode_modulesを除外します空のストアに対する/memoriesの最初のviewはエラーではありません。SDKのローカルファイルシステムメモリツール(BetaLocalFilesystemMemoryTool)は、Claudeの最初の呼び出しの前にメモリルートを作成し、リストのヘッダーに続いて空のディレクトリ自体のサイズとパスの行を1行返します。
ファイルの場合: ヘッダーと行番号付きでファイルの内容を返します。
Here's the content of {path} with line numbers:
{line_numbers}{tab}{content}行番号のフォーマット:
"File {path} exceeds maximum line limit of 999,999 lines."出力例:
Here's the content of /memories/notes.txt with line numbers:
1 Hello World
2 This is line two
10 Line ten
100 Line one hundredClaudeのツール説明には、viewが画像ファイル(.jpg、.jpeg、.png)を表示し、16,000文字を超えるファイルのテキスト表示を切り詰めることも記載されています。画像パスに対するview呼び出しや、長いファイルに対する範囲指定の追加表示を想定してください。
"The path {path} does not exist. Please provide a valid path."新しいファイルを作成します。
{
"command": "create",
"path": "/memories/notes.txt",
"file_text": "Meeting notes:\n- Discussed project timeline\n- Next steps defined\n"
}"File created successfully at: {path}""Error: File {path} already exists"Claudeのツール説明には、createがファイルを「作成または上書き」すると記載されているため、既に存在するパスに対するcreate呼び出しを想定してください。エラーを返すのがリファレンスの動作ですが、代わりに上書きすることも有効な実装の選択肢です。
ファイル内のテキストを置換します。
{
"command": "str_replace",
"path": "/memories/preferences.txt",
"old_str": "Favorite color: blue",
"new_str": "Favorite color: green"
}str_replaceではnew_strはオプションです。省略された場合、old_strは置換なしで削除されます。
"The memory file has been edited."に続いて、行番号付きの編集されたファイルのスニペット"Error: The path {path} does not exist. Please provide a valid path.""No replacement was performed, old_str `\{old_str}` did not appear verbatim in {path}."old_strが複数回出現する場合は次を返します:"No replacement was performed. Multiple occurrences of old_str `\{old_str}` in lines: {line_numbers}. Please ensure it is unique"パスがディレクトリの場合、「ファイルが存在しない」エラーを返します。
特定の行にテキストを挿入します。
{
"command": "insert",
"path": "/memories/todo.txt",
"insert_line": 2,
"insert_text": "- Review memory tool documentation\n"
}insert_textは行insert_lineの後に挿入され、0はファイルの先頭に挿入します。
"The file {path} has been edited.""Error: The path {path} does not exist""Error: Invalid `insert_line` parameter: {insert_line}. It should be within the range of lines of the file: [0, {n_lines}]"パスがディレクトリの場合、「ファイルが存在しない」エラーを返します。
ファイルまたはディレクトリを削除します。
{
"command": "delete",
"path": "/memories/old_file.txt"
}"Successfully deleted {path}""Error: The path {path} does not exist"ディレクトリとそのすべての内容を再帰的に削除します。ツール説明では、Claudeは/memoriesディレクトリ自体を削除できないと記載されているため、パスがメモリルートであるdeleteは拒否してください。
ファイルまたはディレクトリの名前を変更または移動します。
{
"command": "rename",
"old_path": "/memories/draft.txt",
"new_path": "/memories/final.txt"
}"Successfully renamed {old_path} to {new_path}""Error: The path {old_path} does not exist""Error: The destination {new_path} already exists"ディレクトリの名前を変更します。ツール説明では、Claudeは/memoriesディレクトリ自体の名前を変更できないと記載されているため、old_pathがメモリルートであるrenameは拒否してください。
リクエストのtoolsにメモリツールが含まれている場合、APIは自動的にこの指示をシステムプロンプトに追加します。自分で送信する必要はありません。
IMPORTANT: ALWAYS VIEW YOUR MEMORY DIRECTORY BEFORE DOING ANYTHING ELSE.
MEMORY PROTOCOL:
1. Use the `view` command of your `memory` tool to check for earlier progress.
2. ... (work on the task) ...
- As you make progress, record status / progress / thoughts etc in your memory.
ASSUME INTERRUPTION: Your context window might be reset at any moment, so you risk losing any progress that is not recorded in your memory directory.Claudeのツール説明には、メモリディレクトリを整理された状態に保つようにという指示が既に含まれているため、その指示を繰り返す必要はありません。それでもClaudeが雑然としたメモリファイルを作成する場合は、プロンプトで補強できます。
Note: when editing your memory folder, always try to keep its content up-to-date, coherent and organized. You can rename or delete files that are no longer relevant. Do not create new files unless necessary.Claudeがメモリに書き込む内容をガイドすることもできます。例:「メモリシステムには<topic>に関連する情報のみを書き留めてください。」
アプリケーションはClaudeがリクエストするすべてのファイル操作を実行するため、これらの保護策はあなたの責任です。
Claudeは通常、機密情報をメモリファイルに書き込むことを拒否します。より強力な保証を得るには、ハンドラーがファイルを書き込む前に機密データを除去する検証を追加してください。
メモリファイルのサイズを追跡し、ファイルが成長できる上限を設定してください。viewコマンドが返す文字数に上限を設定し、Claudeがview_rangeで残りをページングできるようにすることを検討してください。
長期間アクセスされていないメモリファイルを定期的に削除してください。
/memories/../../secrets.envのような悪意のあるパスは、/memoriesディレクトリ外のファイルに到達する可能性があります。実装では、ディレクトリトラバーサル攻撃を防ぐために、すべてのコマンドのすべてのパスを検証する必要があります。
以下の保護策を検討してください。
/memoriesで始まることを検証する../、..\\、その他のトラバーサルパターンなどのシーケンスを含むパスを拒否する%2e%2e%2f)に注意するpathlib.Path.resolve()とrelative_to())メモリツールは、テキストエディタツールと同様のエラー処理パターンを使用します。各コマンドのエラーメッセージはツールコマンドに記載されています。Claudeにエラーを返すには、ツール結果でis_errorをtrueに設定し、メッセージをcontentに入れます。
{
"type": "tool_result",
"tool_use_id": "toolu_01C4D5E6F7G8H9I0J1K2L3M4",
"content": "Error: The path /memories/notes.txt does not exist",
"is_error": true
}メモリツールは、長時間実行される会話を管理するためにコンテキスト編集と組み合わせて使用できます。詳細については、コンテキスト編集を参照してください。
メモリツールは、サーバーサイドで古い会話コンテキストを要約するコンパクションと組み合わせることもできます。コンテキスト編集はクライアント側で特定のツール結果をクリアします。コンパクションは、会話がコンテキストウィンドウの制限に近づいたときに、サーバー上で会話全体を自動的に要約します。
長時間実行されるエージェントの場合、両方の使用を検討してください。コンパクションはクライアントサイドの管理なしでアクティブなコンテキストを小さく保ち、メモリは要約を経ても残す必要がある情報を保持します。
複数のエージェントセッションにまたがるソフトウェアプロジェクトでは、作業の進行に合わせてその場しのぎで書き込むのではなく、メモリファイルを意図的にセットアップしてください。以下のパターンは、メモリを復旧メカニズムに変えます。各新しいセッションは、前のセッションが記録した状態から再開します。
初期化セッション: 最初のセッションは、実質的な作業が始まる前にメモリファイルをセットアップします。これには、進捗ログ(何が完了し、次に何をするかを追跡)、機能チェックリスト(作業範囲を定義)、プロジェクトに必要な起動または初期化スクリプトへの参照が含まれます。
後続のセッション: 各新しいセッションは、それらのメモリファイルを読み取ることから始まります。これにより、コードベースを再探索したり、以前の決定をたどり直したりすることなく、プロジェクトの状態が復元されます。
セッション終了時の更新: セッションが終了する前に、完了した内容と残っている内容で進捗ログを更新します。これにより、次のセッションが正確な開始点を持つことが保証されます。
一度に1つの機能に取り組んでください。コードが書かれたときではなく、エンドツーエンドの検証で動作が確認された後にのみ、機能を完了としてマークしてください。これにより、セッション間で進捗ログが正確に保たれます。
初期化スクリプト、進捗ファイルの構造、gitベースの復旧を含む、このパターンの実践的な詳細なケーススタディについては、Effective harnesses for long-running agentsを参照してください。
永続的なbashセッションでシェルコマンドを実行します。
コンテキスト編集により、会話コンテキストが増大するにつれて自動的に管理します。
コンテキストウィンドウの制限に近づく長い会話を管理するためのサーバーサイドのコンテキストコンパクション。
Anthropic提供ツールのディレクトリと、オプションのツール定義プロパティのリファレンス。
Was this page helpful?