Skip to main content
Glama

search_memories_advanced

Search and retrieve memories from AGI MCP Server using advanced criteria, including text queries, vector embeddings, memory types, importance range, and date ranges for precise results.

Instructions

Advanced memory search with multiple criteria

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
criteriaYes

Implementation Reference

  • The core handler function implementing advanced memory search using PostgreSQL full-text search (tsvector/tsquery), vector similarity (<=> operator), and filters for memory types, importance range, date range, with dynamic ordering by relevance scores and importance.
    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; } }
  • Primary input schema and tool metadata definition for the search_memories_advanced tool.
    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:473-522 (registration)
    Tool registration in MCP server tools list (includes schema). Note: schema identical to memory-tools.js version.
    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 request handler dispatch case that invokes the memoryManager.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