Claude has a native memory tool that allows it to store and retrieve information across conversations. Supermemory provides a backend implementation that maps Claude’s memory commands to persistent storage.
This integration works with Claude’s built-in memory tool type, introduced in the Anthropic API. It requires the context-management beta flag.
Installation
npm install @supermemory/tools @anthropic-ai/sdk
Quick Start
import Anthropic from "@anthropic-ai/sdk"
import { createClaudeMemoryTool } from "@supermemory/tools/claude-memory"
const anthropic = new Anthropic ()
const memoryTool = createClaudeMemoryTool ( process . env . SUPERMEMORY_API_KEY ! , {
projectId: "my-app" ,
})
async function chatWithMemory ( userMessage : string ) {
// Send message to Claude with memory tool
const response = await anthropic . beta . messages . create ({
model: "claude-sonnet-4-5" ,
max_tokens: 2048 ,
messages: [{ role: "user" , content: userMessage }],
tools: [{ type: "memory_20250818" , name: "memory" }],
betas: [ "context-management-2025-06-27" ],
})
// Handle any memory tool calls
const toolResults = []
for ( const block of response . content ) {
if ( block . type === "tool_use" && block . name === "memory" ) {
const toolResult = await memoryTool . handleCommandForToolResult (
block . input as any ,
block . id
)
toolResults . push ( toolResult )
}
}
// Send tool results back to Claude if needed
if ( toolResults . length > 0 ) {
const finalResponse = await anthropic . beta . messages . create ({
model: "claude-sonnet-4-5" ,
max_tokens: 2048 ,
messages: [
{ role: "user" , content: userMessage },
{ role: "assistant" , content: response . content },
{ role: "user" , content: toolResults },
],
tools: [{ type: "memory_20250818" , name: "memory" }],
betas: [ "context-management-2025-06-27" ],
})
return finalResponse
}
return response
}
// Example usage
const response = await chatWithMemory (
"Remember that I prefer React with TypeScript for my projects"
)
console . log ( response . content [ 0 ])
Configuration
import { createClaudeMemoryTool } from "@supermemory/tools/claude-memory"
const memoryTool = createClaudeMemoryTool ( process . env . SUPERMEMORY_API_KEY ! , {
// Scope memories to a project or user
projectId: "my-app" ,
// Or use container tags for more flexibility
containerTags: [ "user-123" , "project-alpha" ],
// Custom memory container prefix (default: "claude_memory")
memoryContainerTag: "my_memory_prefix" ,
// Custom API endpoint
baseUrl: "https://custom.api.com" ,
})
How It Works
Claude’s memory tool uses a file-system metaphor. Supermemory maps these operations to document storage:
Claude Command Supermemory Action viewSearch/retrieve documents createAdd new document str_replaceUpdate document content insertInsert content at line deleteDelete document renameMove document to new path
Memory Path Structure
All memory paths must start with /memories/:
/memories/preferences.txt # User preferences
/memories/projects/react.txt # Project-specific notes
/memories/context/current.txt # Current context
Commands Reference
View (Read/List)
// List directory contents
{ command : "view" , path : "/memories/" }
// Read file contents
{ command : "view" , path : "/memories/preferences.txt" }
// Read specific lines
{ command : "view" , path : "/memories/notes.txt" , view_range : [ 1 , 10 ] }
Create
{
command : "create" ,
path : "/memories/preferences.txt" ,
file_text : "User prefers dark mode \n Favorite language: TypeScript"
}
String Replace
{
command : "str_replace" ,
path : "/memories/preferences.txt" ,
old_str : "dark mode" ,
new_str : "light mode"
}
Insert
{
command : "insert" ,
path : "/memories/notes.txt" ,
insert_line : 5 ,
insert_text : "New note added here"
}
Delete
{ command : "delete" , path : "/memories/old-notes.txt" }
Rename
{
command : "rename" ,
path : "/memories/old-name.txt" ,
new_path : "/memories/new-name.txt"
}
Complete Example
import Anthropic from "@anthropic-ai/sdk"
import { createClaudeMemoryTool } from "@supermemory/tools/claude-memory"
const anthropic = new Anthropic ()
const memoryTool = createClaudeMemoryTool ( process . env . SUPERMEMORY_API_KEY ! , {
projectId: "assistant" ,
})
async function runConversation () {
const messages : Anthropic . MessageParam [] = []
// Helper to chat with memory
async function chat ( userMessage : string ) {
messages . push ({ role: "user" , content: userMessage })
let response = await anthropic . beta . messages . create ({
model: "claude-sonnet-4-5" ,
max_tokens: 2048 ,
messages ,
tools: [{ type: "memory_20250818" , name: "memory" }],
betas: [ "context-management-2025-06-27" ],
})
// Handle tool calls
while ( response . stop_reason === "tool_use" ) {
const toolResults = []
for ( const block of response . content ) {
if ( block . type === "tool_use" && block . name === "memory" ) {
const result = await memoryTool . handleCommandForToolResult (
block . input as any ,
block . id
)
toolResults . push ( result )
}
}
messages . push ({ role: "assistant" , content: response . content })
messages . push ({ role: "user" , content: toolResults })
response = await anthropic . beta . messages . create ({
model: "claude-sonnet-4-5" ,
max_tokens: 2048 ,
messages ,
tools: [{ type: "memory_20250818" , name: "memory" }],
betas: [ "context-management-2025-06-27" ],
})
}
messages . push ({ role: "assistant" , content: response . content })
return response
}
// Have a conversation with persistent memory
await chat ( "My name is Alex and I'm a backend developer" )
await chat ( "I prefer Go for systems programming" )
await chat ( "What do you remember about me?" )
}
runConversation ()
Environment Variables
SUPERMEMORY_API_KEY = your_supermemory_key
ANTHROPIC_API_KEY = your_anthropic_key
Next Steps
AI SDK Integration Use with Vercel AI SDK for streamlined development
OpenAI SDK Memory tools for OpenAI function calling