Skip to main content
Glama

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
NameRequiredDescriptionDefault
criteriaYes

Implementation Reference

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/QuixiAI/agi-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server