Skip to main content
Glama

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

Implementation Reference

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

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/randyandrade/agi-mcp-server'

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