Skip to main content
Glama

semantic_search

Search for entities in your knowledge graph memory using semantic meaning and vector similarity to find relevant information based on conceptual relationships.

Instructions

Search for entities semantically using vector embeddings and similarity in your Memento MCP knowledge graph memory

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesThe text query to search for semantically
limitNoMaximum number of results to return (default: 10)
min_similarityNoMinimum similarity threshold from 0.0 to 1.0 (default: 0.6)
entity_typesNoFilter results by entity types
hybrid_searchNoWhether to combine keyword and semantic search (default: true)
semantic_weightNoWeight of semantic results in hybrid search from 0.0 to 1.0 (default: 0.6)

Implementation Reference

  • MCP tool handler case for 'semantic_search' that parses input parameters, sets semantic search options, and delegates to KnowledgeGraphManager.search method.
    case 'semantic_search':
      try {
        // Extract search options from args
        const searchOptions = {
          limit: args.limit || 10,
          minSimilarity: args.min_similarity || 0.6,
          entityTypes: args.entity_types || [],
          hybridSearch: args.hybrid_search !== undefined ? args.hybrid_search : true,
          semanticWeight: args.semantic_weight || 0.6,
          semanticSearch: true,
        };
    
        // Call the search method with semantic search options
        const results = await knowledgeGraphManager.search(String(args.query), searchOptions);
    
        return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
      } catch (error: Error | unknown) {
        const errorMessage = error instanceof Error ? error.message : String(error);
        return {
          content: [{ type: 'text', text: `Error performing semantic search: ${errorMessage}` }],
        };
      }
  • Tool schema definition including name, description, and inputSchema for the semantic_search tool in the MCP tools list.
    {
      name: 'semantic_search',
      description:
        'Search for entities semantically using vector embeddings and similarity in your Memento MCP knowledge graph memory',
      inputSchema: {
        type: 'object',
        properties: {
          query: {
            type: 'string',
            description: 'The text query to search for semantically',
          },
          limit: {
            type: 'number',
            description: 'Maximum number of results to return (default: 10)',
          },
          min_similarity: {
            type: 'number',
            description: 'Minimum similarity threshold from 0.0 to 1.0 (default: 0.6)',
          },
          entity_types: {
            type: 'array',
            items: { type: 'string' },
            description: 'Filter results by entity types',
          },
          hybrid_search: {
            type: 'boolean',
            description: 'Whether to combine keyword and semantic search (default: true)',
          },
          semantic_weight: {
            type: 'number',
            description:
              'Weight of semantic results in hybrid search from 0.0 to 1.0 (default: 0.6)',
          },
        },
        required: ['query'],
      },
    },
  • Core search method in KnowledgeGraphManager that handles semantic_search tool logic by checking options, generating query embeddings, and delegating to storageProvider.semanticSearch or fallback implementations.
    async search(
      query: string,
      options: {
        semanticSearch?: boolean;
        hybridSearch?: boolean;
        limit?: number;
        threshold?: number;
        minSimilarity?: number;
        entityTypes?: string[];
        facets?: string[];
        offset?: number;
      } = {}
    ): Promise<KnowledgeGraph> {
      // If hybridSearch is true, always set semanticSearch to true as well
      if (options.hybridSearch) {
        options = { ...options, semanticSearch: true };
      }
    
      // Check if semantic search is requested
      if (options.semanticSearch || options.hybridSearch) {
        // Check if we have a storage provider with semanticSearch method
        if (this.storageProvider && hasSemanticSearch(this.storageProvider)) {
          try {
            // Generate query vector if we have an embedding service
            if (this.embeddingJobManager) {
              const embeddingService = this.embeddingJobManager['embeddingService'];
              if (embeddingService) {
                const queryVector = await embeddingService.generateEmbedding(query);
                return this.storageProvider.semanticSearch(query, {
                  ...options,
                  queryVector,
                });
              }
            }
    
            // Fall back to text search if no embedding service
            return this.storageProvider.searchNodes(query);
          } catch (error) {
            logger.error('Provider semanticSearch failed, falling back to basic search', error);
            return this.storageProvider.searchNodes(query);
          }
        } else if (this.storageProvider) {
          // Fall back to searchNodes if semanticSearch is not available in the provider
          return this.storageProvider.searchNodes(query);
        }
    
        // If no storage provider or its semanticSearch is not available, try internal semantic search
        if (this.embeddingJobManager) {
          try {
            // Try to use semantic search
            const results = await this.semanticSearch(query, {
              hybridSearch: options.hybridSearch || false,
              limit: options.limit || 10,
              threshold: options.threshold || options.minSimilarity || 0.5,
              entityTypes: options.entityTypes || [],
              facets: options.facets || [],
              offset: options.offset || 0,
            });
    
            return results;
          } catch (error) {
            // Log error but fall back to basic search
            logger.error('Semantic search failed, falling back to basic search', error);
    
            // Explicitly call searchNodes if available in the provider
            if (this.storageProvider) {
              return (this.storageProvider as StorageProvider).searchNodes(query);
            }
          }
        } else {
          logger.warn('Semantic search requested but no embedding capability available');
        }
      }
    
      // Use basic search
      return this.searchNodes(query);
    }
  • Type guard function to check if the storage provider supports semanticSearch method.
    function hasSemanticSearch(
      provider: StorageProvider
    ): provider is StorageProviderWithSemanticSearch {
      return (
        'semanticSearch' in provider &&
        typeof (provider as StorageProviderWithSemanticSearch).semanticSearch === 'function'
      );
    }
  • Registers the MCP ListTools and CallTool request handlers which expose and execute the semantic_search tool.
    server.setRequestHandler(ListToolsRequestSchema, async (_request) => {
      try {
        const result = await handleListToolsRequest();
        return result;

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/gannonh/memento-mcp'

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