remember_user
Store user-specific memories like preferences and identity for persistence across sessions. Use for long-term facts.
Instructions
Store a user-scoped memory that persists across all sessions. Use for preferences, identity, long-term facts.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| userId | Yes | User identifier | |
| content | Yes | Memory content to store | |
| role | No | user | |
| metadata | No | Optional key-value metadata |
Implementation Reference
- src/index.ts:333-341 (handler)The handler for 'remember_user' — calls memory.rememberUser() and returns the result as JSON. This is the function that executes the tool logic when the tool is invoked.
case 'remember_user': { const entry = await memory.rememberUser( args.userId as string, args.content as string, (args.role as 'user' | 'assistant' | 'system') || 'user', args.metadata as Record<string, unknown> | undefined ); return { content: [{ type: 'text', text: JSON.stringify(entry, null, 2) }] }; } - src/index.ts:129-142 (schema)Input schema definition for 'remember_user' — defines userId (string, required), content (string, required), role (enum with default 'user'), and metadata (optional object). Registered in the ListToolsRequestSchema handler.
// ── User-scoped (cross-session) memory ────────────────────────────── { name: 'remember_user', description: 'Store a user-scoped memory that persists across all sessions. Use for preferences, identity, long-term facts.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, content: { type: 'string', description: 'Memory content to store' }, role: { type: 'string', enum: ['user', 'assistant', 'system'], default: 'user' }, metadata: { type: 'object', description: 'Optional key-value metadata' }, }, required: ['userId', 'content'], }, - src/index.ts:35-194 (registration)The tool is registered in the ListToolsRequestSchema handler within the tools array returned to the MCP client. The 'remember_user' entry is at lines 130-143 of that array (within the broader registration from line 35-256).
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ // ── Session memory ────────────────────────────────────────────────── { name: 'remember', description: 'Store a memory entry for a session. Embeddings and graph extraction happen automatically.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, content: { type: 'string', description: 'Memory content to store' }, role: { type: 'string', enum: ['user', 'assistant', 'system'], default: 'user' }, metadata: { type: 'object', description: 'Optional key-value metadata' }, }, required: ['sessionId', 'content'], }, }, { name: 'recall', description: 'Retrieve relevant memories via semantic search (falls back to keyword). Searches working + long_term tiers. Pass userId to blend in cross-session user facts.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, query: { type: 'string', description: 'Search query' }, limit: { type: 'number', description: 'Max results (default 10)', default: 10 }, userId: { type: 'string', description: 'Optional: also blend in this user\'s cross-session memories' }, tiers: { type: 'string', description: 'Comma-separated tiers to search: working,long_term,archived (default: working,long_term)' }, }, required: ['sessionId', 'query'], }, }, { name: 'history', description: 'Get recent conversation history for a session in chronological order.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, limit: { type: 'number', description: 'Max entries (default 20)', default: 20 }, }, required: ['sessionId'], }, }, { name: 'forget', description: 'Delete session memories. Delete all, one by ID, or entries before a date.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, id: { type: 'string', description: 'Specific memory ID to delete (optional)' }, before: { type: 'string', description: 'ISO date — delete entries before this date (optional)' }, }, required: ['sessionId'], }, }, { name: 'stats', description: 'Memory statistics for a session — total, by role, by tier (working/long_term/archived), graph counts.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, }, required: ['sessionId'], }, }, { name: 'consolidate', description: 'Consolidate old working memories into dense long-term summaries via LLM. Archives originals.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, batch: { type: 'number', description: 'Number of memories to consolidate (default 50)' }, keep: { type: 'number', description: 'Most recent N to leave untouched (default 20)' }, dryRun: { type: 'boolean', description: 'Preview summaries without writing (default false)' }, }, required: ['sessionId'], }, }, { name: 'graph', description: 'Query the knowledge graph for an entity — returns relationships and source memories. Requires ENGRAM_GRAPH=1.', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Session identifier' }, entity: { type: 'string', description: 'Entity name to look up (case-insensitive)' }, }, required: ['sessionId', 'entity'], }, }, // ── User-scoped (cross-session) memory ────────────────────────────── { name: 'remember_user', description: 'Store a user-scoped memory that persists across all sessions. Use for preferences, identity, long-term facts.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, content: { type: 'string', description: 'Memory content to store' }, role: { type: 'string', enum: ['user', 'assistant', 'system'], default: 'user' }, metadata: { type: 'object', description: 'Optional key-value metadata' }, }, required: ['userId', 'content'], }, }, { name: 'recall_user', description: 'Recall user-scoped memories — works from any session context.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, query: { type: 'string', description: 'Search query (optional — returns all if omitted)' }, limit: { type: 'number', description: 'Max results (default 10)', default: 10 }, }, required: ['userId'], }, }, { name: 'forget_user', description: 'Delete user-scoped memories.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, id: { type: 'string', description: 'Specific memory ID (optional)' }, before: { type: 'string', description: 'ISO date — delete entries before this date (optional)' }, }, required: ['userId'], }, }, { name: 'consolidate_user', description: 'Consolidate user-scoped working memories into long-term summaries.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, batch: { type: 'number', description: 'Number of memories to consolidate (default 50)' }, keep: { type: 'number', description: 'Most recent N to leave untouched (default 20)' }, dryRun: { type: 'boolean', description: 'Preview without writing (default false)' }, }, required: ['userId'], }, }, { name: 'user_stats', description: 'Memory statistics for a user — total, by role, by tier.', inputSchema: { type: 'object', properties: { userId: { type: 'string', description: 'User identifier' }, }, required: ['userId'], }, },