Skip to main content
Glama
IzumiSy

MCP DuckDB Knowledge Graph Memory Server

search_nodes

Find knowledge graph nodes by searching entity names, types, or observation content to retrieve relevant information from stored data.

Instructions

Search for nodes in the knowledge graph based on a query

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query to match against entity names, types, and observation content

Implementation Reference

  • The core handler function for searching nodes using Fuse.js fuzzy search on entity names, types, and observations, then retrieving related relations from DuckDB.
    async searchNodes(query: string): Promise<KnowledgeGraph> {
      if (!query || query.trim() === "") {
        return { entities: [], relations: [] };
      }
    
      // Get all entities
      const allEntities = await this.getAllEntities();
    
      // Update Fuse.js collection
      this.fuse.setCollection(allEntities);
    
      // Execute search
      const results = this.fuse.search(query);
    
      // Extract entities from search results (remove duplicates)
      const uniqueEntities = new Map<string, Entity>();
      for (const result of results) {
        if (!uniqueEntities.has(result.item.name)) {
          uniqueEntities.set(result.item.name, result.item);
        }
      }
    
      const entities = Array.from(uniqueEntities.values());
    
      // Create a set of entity names
      const entityNames = entities.map((entity) => entity.name);
    
      if (entityNames.length === 0) {
        return { entities: [], relations: [] };
      }
    
      // Create placeholders
      const placeholders = entityNames.map(() => "?").join(",");
    
      using conn = await this.getConn();
    
      // Get related relations
      const relationsReader = await conn.executeAndReadAll(
        `
        SELECT from_entity as "from", to_entity as "to", relationType
        FROM relations
        WHERE from_entity IN (${placeholders})
        OR to_entity IN (${placeholders})
        `,
        [...entityNames, ...entityNames]
      );
      const relationsData = relationsReader.getRows();
    
      // Convert results to an array of Relation objects
      const relations = relationsData.map((row: any) => {
        return {
          from: row[0] as string,
          to: row[1] as string,
          relationType: row[2] as string,
        };
      });
    
      return {
        entities,
        relations,
      };
    }
  • src/server.ts:159-181 (registration)
    Registers the 'search_nodes' tool with the MCP server, defining its name, description, input schema (query string), and handler that delegates to the manager.
    server.tool(
      "search_nodes",
      "Search for nodes in the knowledge graph based on a query",
      {
        query: z
          .string()
          .describe(
            "The search query to match against entity names, types, and observation content"
          ),
      },
      async ({ query }) => ({
        content: [
          {
            type: "text",
            text: JSON.stringify(
              await knowledgeGraphManager.searchNodes(query),
              null,
              2
            ),
          },
        ],
      })
    );
  • TypeScript interface defining the KnowledgeGraphManagerInterface, including the searchNodes method signature for type safety.
    export type KnowledgeGraphManagerInterface = {
      createEntities(entities: Entity[]): Promise<Entity[]>;
      createRelations(relations: Relation[]): Promise<Relation[]>;
      addObservations(observations: Array<Observation>): Promise<Observation[]>;
      deleteEntities(entityNames: string[]): Promise<void>;
      deleteObservations(deletions: Array<Observation>): Promise<void>;
      deleteRelations(relations: Relation[]): Promise<void>;
      searchNodes(query: string): Promise<KnowledgeGraph>;
      openNodes(names: string[]): Promise<KnowledgeGraph>;
    };
  • Type definition for KnowledgeGraph, the return type of searchNodes.
    export type KnowledgeGraph = {
      entities: Entity[];
      relations: Relation[];
    };

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/IzumiSy/mcp-duckdb-memory-server'

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