Skip to main content
Glama
waldzellai

Exa Websets MCP Server

by waldzellai
knowledgeGraph.ts3.58 kB
import { z } from 'zod'; import { toolRegistry, ToolCategory, ServiceType } from './config.js'; import { createRequestLogger } from '../utils/logger.js'; import KnowledgeGraphService from '../services/KnowledgeGraphService.js'; const knowledgeGraph = new KnowledgeGraphService(); const KnowledgeGraphSchema = z.object({ operation: z.enum([ 'create_entities', 'create_relations', 'add_observations', 'delete_entities', 'delete_observations', 'delete_relations', 'read_graph', 'search_nodes', 'open_nodes' ]), entities: z.array(z.object({ name: z.string(), entityType: z.string(), observations: z.array(z.string()).default([]) })).optional(), relations: z.array(z.object({ from: z.string(), to: z.string(), relationType: z.string() })).optional(), observations: z.array(z.object({ entityName: z.string(), contents: z.array(z.string()) })).optional(), deletions: z.array(z.object({ entityName: z.string(), observations: z.array(z.string()) })).optional(), names: z.array(z.string()).optional(), query: z.string().optional() }); toolRegistry['knowledge_graph'] = { name: 'knowledge_graph', description: 'Maintain an onboard knowledge graph of webset results.', schema: KnowledgeGraphSchema.shape, category: ToolCategory.WEBSETS, service: ServiceType.WEBSETS, handler: async (args) => { const { operation, entities, relations, observations, deletions, names, query } = args; const requestId = `knowledge_graph-${Date.now()}-${Math.random().toString(36).slice(2,7)}`; const logger = createRequestLogger(requestId, 'knowledge_graph'); logger.start(operation); try { switch (operation) { case 'create_entities': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.createEntities(entities || []), null, 2) }] }; case 'create_relations': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.createRelations(relations || []), null, 2) }] }; case 'add_observations': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.addObservations(observations || []), null, 2) }] }; case 'delete_entities': await knowledgeGraph.deleteEntities(names || []); return { content: [{ type: 'text', text: 'Entities deleted successfully' }] }; case 'delete_observations': await knowledgeGraph.deleteObservations(deletions || []); return { content: [{ type: 'text', text: 'Observations deleted successfully' }] }; case 'delete_relations': await knowledgeGraph.deleteRelations(relations || []); return { content: [{ type: 'text', text: 'Relations deleted successfully' }] }; case 'read_graph': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.readGraph(), null, 2) }] }; case 'search_nodes': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.searchNodes(query || ''), null, 2) }] }; case 'open_nodes': return { content: [{ type: 'text', text: JSON.stringify(await knowledgeGraph.openNodes(names || []), null, 2) }] }; default: throw new Error(`Unknown operation: ${operation}`); } } catch (error: any) { logger.error(error); return { content: [{ type: 'text', text: `Knowledge graph error: ${error.message}` }], isError: true }; } }, enabled: true }; export default toolRegistry['knowledge_graph'];

Implementation Reference

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/waldzellai/exa-mcp-server-websets'

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