search_memories_advanced
Search stored memories using text queries, vector similarity, date ranges, importance levels, and memory type filters to retrieve relevant information.
Instructions
Advanced memory search with multiple criteria
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| criteria | Yes |
Implementation Reference
- src/memory-manager.js:506-595 (handler)Core implementation of the search_memories_advanced tool. Performs complex database query combining text search, vector similarity, type filtering, importance range, and date range filtering on memories.
async searchMemoriesAdvanced(criteria) { try { const { textQuery, embedding, memoryTypes = [], importanceRange = [0, 1], dateRange = {}, limit = 10 } = criteria; let query = this.db .select({ id: schema.memories.id, type: schema.memories.type, content: schema.memories.content, importance: schema.memories.importance, accessCount: schema.memories.accessCount, createdAt: schema.memories.createdAt, relevanceScore: schema.memories.relevanceScore, textRank: textQuery ? sql`ts_rank(to_tsvector('english', ${schema.memories.content}), plainto_tsquery('english', ${textQuery}))`.as('text_rank') : sql`0`.as('text_rank'), similarityScore: embedding ? sql`1 - (${schema.memories.embedding} <=> ${`[${embedding.join(',')}]`}::vector)`.as('similarity_score') : sql`0`.as('similarity_score') }) .from(schema.memories); // Build where conditions const conditions = [eq(schema.memories.status, 'active')]; if (textQuery) { conditions.push( sql`to_tsvector('english', ${schema.memories.content}) @@ plainto_tsquery('english', ${textQuery})` ); } if (memoryTypes.length > 0) { conditions.push(inArray(schema.memories.type, memoryTypes)); } conditions.push( and( gte(schema.memories.importance, importanceRange[0]), lte(schema.memories.importance, importanceRange[1]) ) ); if (dateRange.start) { conditions.push(gte(schema.memories.createdAt, dateRange.start)); } if (dateRange.end) { conditions.push(lte(schema.memories.createdAt, dateRange.end)); } query = query.where(and(...conditions)); // Order by relevance if (textQuery && embedding) { query = query.orderBy( sql`ts_rank(to_tsvector('english', ${schema.memories.content}), plainto_tsquery('english', ${textQuery})) DESC`, sql`1 - (${schema.memories.embedding} <=> ${`[${embedding.join(',')}]`}::vector) DESC`, desc(schema.memories.importance) ); } else if (textQuery) { query = query.orderBy( sql`ts_rank(to_tsvector('english', ${schema.memories.content}), plainto_tsquery('english', ${textQuery})) DESC`, desc(schema.memories.importance) ); } else if (embedding) { query = query.orderBy( sql`1 - (${schema.memories.embedding} <=> ${`[${embedding.join(',')}]`}::vector) DESC`, desc(schema.memories.importance) ); } else { query = query.orderBy(desc(schema.memories.importance)); } const results = await query.limit(limit); return results; } catch (error) { const truncatedEmbedding = embedding && embedding.length > 10 ? `[${embedding.slice(0, 5).join(',')}...${embedding.slice(-5).join(',')}] (${embedding.length} values)` : embedding ? `[${embedding.join(',')}]` : 'none'; console.error('Error in advanced search with embedding:', truncatedEmbedding, 'textQuery:', textQuery, error.message); throw error; } } - mcp.js:473-522 (schema)Input schema definition for the search_memories_advanced tool, returned by ListToolsRequestHandler.
name: "search_memories_advanced", description: "Advanced memory search with multiple criteria", inputSchema: { type: "object", properties: { criteria: { type: "object", properties: { text_query: { type: "string", description: "Text search query" }, embedding: { type: "array", items: { type: "number" }, description: "Vector embedding for similarity search" }, memory_types: { type: "array", items: { type: "string" }, description: "Filter by memory types", default: [] }, importance_range: { type: "array", items: { type: "number" }, minItems: 2, maxItems: 2, description: "Importance range [min, max]", default: [0, 1] }, date_range: { type: "object", properties: { start: { type: "string", format: "date-time" }, end: { type: "string", format: "date-time" } }, default: {} }, limit: { type: "integer", description: "Maximum number of results", default: 10 } } } }, required: ["criteria"] } } - mcp.js:678-680 (registration)MCP server handler registration: switch case in CallToolRequestSchema handler that invokes the MemoryManager's searchMemoriesAdvanced method.
case "search_memories_advanced": const advancedResults = await memoryManager.searchMemoriesAdvanced(args.criteria); return { content: [{ type: "text", text: JSON.stringify(advancedResults, null, 2) }] };