search_memories_advanced
Search stored AI memories using text queries, vector similarity, memory types, importance levels, and date ranges 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)The main handler implementation for search_memories_advanced. This method accepts a criteria object with textQuery, embedding, memoryTypes, importanceRange, dateRange, and limit parameters. It builds a complex SQL query using Drizzle ORM with full-text search (ts_rank), vector similarity search (embedding <=>), and multiple filters (memory type, importance, date range). Results are ordered by relevance based on the combination of text and vector search, with importance as a fallback.
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:678-680 (registration)Registration/case handler in CallToolRequestSchema that routes the search_memories_advanced tool call to the memoryManager.searchMemoriesAdvanced method with the criteria argument.
case "search_memories_advanced": const advancedResults = await memoryManager.searchMemoriesAdvanced(args.criteria); return { content: [{ type: "text", text: JSON.stringify(advancedResults, null, 2) }] }; - mcp.js:473-522 (schema)Tool schema definition for search_memories_advanced in the ListToolsRequestSchema. Defines the input parameters including text_query, embedding, memory_types, importance_range, date_range, and limit, all nested under a 'criteria' object.
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"] } } - src/tools/memory-tools.js:447-496 (schema)Alternative schema definition for search_memories_advanced exported as part of the memoryTools array. Contains the same structure as the mcp.js schema with text_query, embedding, memory_types, importance_range, date_range, and limit parameters.
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"] } }