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
TableJSON 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) }] };