ee-mcp-server
Version:
Model Context Protocol server for Evolution Engineering
1 lines • 31.3 kB
Source Map (JSON)
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/config/index.ts","../src/services/falkordb.service.ts","../src/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import dotenv from 'dotenv';\r\n\r\n// Load environment variables from .env file\r\ndotenv.config();\r\n\r\nexport const config = {\r\n falkorDB: {\r\n host: 'localhost',\r\n port: 6379,\r\n username: '',\r\n password: '',\r\n },\r\n mcp: {\r\n apiKey: process.env.EE_API_KEY || '*',\r\n },\r\n};","import { FalkorDB } from 'falkordb';\r\nimport { config } from '../config';\r\n\r\ninterface ApiKeyVerificationResult {\r\n valid: boolean;\r\n data: any; // Or a more specific type if known\r\n message: string;\r\n}\r\n\r\nclass FalkorDBService {\r\n private client: FalkorDB | null = null;\r\n private apiKey: string | null = null;\r\n private apiKeyVerificationResult: ApiKeyVerificationResult | null = null;\r\n\r\n constructor() {\r\n // this.init();\r\n }\r\n\r\n /**\r\n * Returns the API key for MCP\r\n * @returns API key as string\r\n */\r\n public async verifyApiKey(apiKey: string): Promise<ApiKeyVerificationResult> {\r\n // if the API key is the same as the one we already verified, return the result\r\n if (this.apiKey === apiKey) {\r\n return {\r\n valid: true,\r\n data: this.apiKeyVerificationResult,\r\n message: \"API KEY verification successful\"\r\n };\r\n }\r\n\r\n const myHeaders = new Headers();\r\n myHeaders.append(\"User-Agent\", \"Apidog/1.0.0 (https://apidog.com)\");\r\n myHeaders.append(\"Content-Type\", \"application/json\");\r\n myHeaders.append(\"Authorization\", \"Bearer eyJhbGciOiJIUzI1NiJ9.e30.Ivww_qG4htViuqxXGRVbHVZbMQETOYnfbYf06HsS_B4\");\r\n myHeaders.append(\"Accept\", \"*/*\");\r\n myHeaders.append(\"Host\", \"lihiuvyxjttzpdhzafcb.supabase.co\");\r\n myHeaders.append(\"Connection\", \"keep-alive\");\r\n\r\n const raw = JSON.stringify({\r\n \"apiKey\": apiKey\r\n });\r\n\r\n const requestOptions = {\r\n method: 'POST',\r\n headers: myHeaders,\r\n body: raw,\r\n redirect: 'follow' as RequestRedirect,\r\n };\r\n\r\n try {\r\n const response = await fetch(\"https://lihiuvyxjttzpdhzafcb.supabase.co/functions/v1/check-api-key\", requestOptions)\r\n const result = await response.json();\r\n // console.log('API Key Verification Result:', result);\r\n \r\n if (!response.ok) {\r\n throw new Error(\"Error Status \" + response.status.toString());\r\n }\r\n\r\n this.apiKeyVerificationResult = result;\r\n this.apiKey = apiKey;\r\n \r\n // initialize the client with valid credentials\r\n // console.error('APi RESULT',JSON.stringify(this.apiKeyVerificationResult));\r\n const serverConnectionStatus = await this.init();\r\n if (!serverConnectionStatus) {\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n return {\r\n valid: false,\r\n data: {},\r\n message: \"API KEY verification successful, EE MCP Server Connection Failed\"\r\n };\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: result,\r\n message: \"API KEY verification successful, EE MCP Server Connected\"\r\n };\r\n\r\n } catch (error) {\r\n let errorMessage = \"Unknown error occurred during API key verification\";\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n }\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n return {\r\n valid: false,\r\n data: {},\r\n message: \"API KEY verification failed: \" + errorMessage\r\n };\r\n }\r\n }\r\n\r\n private async init(): Promise<boolean> {\r\n try {\r\n // if the API key is the same as the one we already verified, return the result\r\n if (this.apiKey) {\r\n config.falkorDB.password = this.apiKeyVerificationResult?.data?.['FALKORDB_PASSWORD'];\r\n config.falkorDB.username = this.apiKeyVerificationResult?.data?.['FALKORDB_USERNAME'];\r\n config.falkorDB.host = this.apiKeyVerificationResult?.data?.['FALKORDB_HOST'];\r\n config.falkorDB.port = this.apiKeyVerificationResult?.data?.['FALKORDB_PORT'];\r\n \r\n } else {\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n throw new Error('Missing API key');\r\n }\r\n if (this.client) {\r\n await this.client.close();\r\n this.client = null;\r\n }\r\n \r\n this.client = await FalkorDB.connect({\r\n socket: {\r\n host: config.falkorDB.host,\r\n port: config.falkorDB.port,\r\n },\r\n password: config.falkorDB.password,\r\n username: config.falkorDB.username,\r\n });\r\n\r\n // Test connection\r\n const connection = await this.client.connection;\r\n await connection.ping();\r\n // return {\r\n // content: [{\r\n // type: \"text\",\r\n // text: JSON.stringify({\r\n // status: \"success\",\r\n // message: \"Successfully connected to EE MCP Server\"\r\n // })\r\n // }]\r\n // };\r\n return true;\r\n } catch (error) {\r\n return false;\r\n // console.error('Failed to connect to EE MCP Server', error);\r\n // console.error(config.falkorDB);\r\n // Retry connection after a delay\r\n // setTimeout(() => this.init(), 5000);\r\n }\r\n }\r\n\r\n async executeGraphQuery(query: string, apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n if (!query || query.trim() === '') {\r\n return {error:true, result:`Error executing EE MCP Server Graph DB query: No Query Provided`};\r\n }\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n const graphName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_DEFAULT'];\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query(query, params);\r\n return {error:false, result:result};\r\n } catch (error) {\r\n // const sanitizedGraphName = graphName?.replace(/\\n|\\r/g, \"\") ?? \"unknown\";\r\n throw new Error(`Error executing EE MCP Server Graph DB query: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology from EE MCP Server: ${connectionParameters.message}`);\r\n } // Ensure API key is valid before proceeding\r\n }\r\n\r\n async executeOntologyGraphQuery(query: string, apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n if (!query || query.trim() === '') {\r\n return {error:true, result:`Error executing EE MCP Server Ontology Graph DB query: No Query Provided`};\r\n }\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n const graphName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query(query, params);\r\n return {error:false, result:result};\r\n } catch (error) {\r\n throw new Error(`Error executing EE MCP Server Ontology Graph DB query: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology Data from EE MCP Server: ${connectionParameters.message}`);\r\n } // Ensure API key is valid before proceeding\r\n }\r\n\r\n async getOntology(apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n // get the schema name from the api key verification result\r\n const schemaName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n const graphName = schemaName.endsWith('_schema') ? schemaName : schemaName + '_schema';\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query('MATCH (sourceNode)-[relation]->(targetNode) RETURN sourceNode, relation, targetNode', params);\r\n if (!result.data || result.data.length === 0) {\r\n throw new Error('No Ontology found in EE MCP Server');\r\n }\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Error getting Ontology from EE MCP Server: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology from EE MCP Server: ${connectionParameters.message}`);\r\n }\r\n } \r\n\r\n async getOntologyMetadata(apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n // get the schema name from the api key verification result\r\n const schemaName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n const graphName = schemaName\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query(\"MATCH (metadata:MetaInfo) RETURN metadata.Name,metadata.Prompt\", params);\r\n if (!result.data || result.data.length === 0) {\r\n throw new Error('No Ontology Metadata found in EE MCP Server');\r\n }\r\n const instructions = result.data.map((item: any) => `${item['metadata.Name']}: ${item['metadata.Prompt']}`).join('\\n');\r\n return instructions;\r\n } catch (error) {\r\n throw new Error(`Error getting Ontology Metadata from EE MCP Server: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology Metadata from EE MCP Server: ${connectionParameters.message}`);\r\n }\r\n } \r\n\r\n /**\r\n * Lists all available graphs in FalkorDB\r\n * @returns Array of graph names\r\n */\r\n async listGraphs(apiKey: string = config.mcp.apiKey): Promise<string[]> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n try {\r\n return await this.client.list();\r\n } catch (error) {\r\n console.error('Error listing EE Graphs:', error);\r\n throw error;\r\n }\r\n } else {\r\n // Throw an error if the API key is invalid\r\n throw new Error(`Failed to list graphs: ${connectionParameters.message}`);\r\n }\r\n }\r\n\r\n async close() {\r\n if (this.client) {\r\n await this.client.close();\r\n this.client = null;\r\n }\r\n }\r\n}\r\n\r\n// Export a singleton instance\r\nexport const falkorDBService = new FalkorDBService();","import { falkorDBService } from './services/falkordb.service';\r\nimport {\r\n MCPResponse,\r\n MCPProviderMetadata\r\n} from './models/mcp.types';\r\nimport { z } from \"zod\";\r\nimport {\r\n McpServer,\r\n ResourceTemplate,\r\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\nimport { config } from './config';\r\n\r\n// Create an MCP server\r\nconst server = new McpServer({\r\n name: \"EE-GRAPH-MCP\",\r\n version: \"1.0.0\",\r\n description: \"Evolution Engineering Graph MCP Server\",\r\n});\r\n\r\n// Add a tools\r\n\r\n// Read Me for AI Agent\r\nserver.tool(\"read-me\", {}, async (args, extra) => {\r\n const readMe= {\r\n provider: 'EE Graph MCP Server',\r\n version: '1.0.0',\r\n instructions: \"First, test if your API key is valid. If the API key is valid, then get the ontology metadata and instructions. If the API key is not valid, then return an error message. Metadata and instructions will guide you where to find releavant information, how they are connected and how to construct your query to get the information you need. You can get full ontology model using tool get-ontology-model. Use tool query-ontology-semantics to query the ontology semantics and understand the ontology model. Use tool query-knowledge-graph to query real data stored in the knowledge graph.\",\r\n };\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(readMe),\r\n },\r\n ],\r\n };\r\n});\r\n\r\n// Check if the API key is valid\r\nserver.tool(\"is-api-key-valid\", { apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { apiKey?: string }, extra) => {\r\n const startTime = Date.now();\r\n if (args.apiKey === null || args.apiKey === undefined || args.apiKey === \"*\") {\r\n return {\r\n content: [\r\n { type: \"text\", text: JSON.stringify({ error: \"API key is required\" }) }\r\n ],\r\n isError: true \r\n };\r\n }\r\n\r\n const result = await falkorDBService.verifyApiKey(args.apiKey);\r\n if (!result.valid) {\r\n return {\r\n content: [\r\n { type: \"text\", text: JSON.stringify({ error: result.message }) }\r\n ],\r\n isError: true \r\n };\r\n }\r\n\r\n const queryTime = Date.now() - startTime;\r\n const formattedResult: MCPResponse = {\r\n data: `API key ${args.apiKey} is valid`,\r\n metadata: {\r\n timestamp: new Date().toISOString(),\r\n queryTime,\r\n provider: 'EE MCP Server',\r\n source: 'EE Semantic Graphs'\r\n }\r\n };\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(formattedResult),\r\n },\r\n ],\r\n };\r\n});\r\n\r\n// Get the Ontology Metadata and Instructions\r\nserver.tool(\"get-ontology-metadata-and-instructions\", {}, async (args, extra) => {\r\n const response = await falkorDBService.getOntologyMetadata(\r\n config.mcp.apiKey\r\n );\r\n const metadata: MCPProviderMetadata = {\r\n provider: 'EE Graph MCP Server',\r\n version: '1.0.0',\r\n instructions: response,\r\n capabilities: [\r\n 'get.ontology.instructions',\r\n 'get.ontology.metadata',\r\n 'get.ontology.model',\r\n 'query.ontology.semantics',\r\n 'query.knowledge.graph',\r\n ],\r\n graphTypes: ['property', 'directed'],\r\n queryLanguages: ['cypher'],\r\n };\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(metadata),\r\n },\r\n ],\r\n };\r\n});\r\n\r\n// Get the Ontology Model\r\nserver.tool(\"get-ontology-model\", { apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args, extra) => {\r\n if (args.apiKey === null || args.apiKey === undefined || args.apiKey === \"*\") {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: \"API key is required\" }),\r\n },\r\n ],\r\n isError: true\r\n };\r\n }\r\n\r\n try {\r\n const startTime = Date.now();\r\n\r\n // Execute the query using FalkorDB service \r\n const result = await falkorDBService.getOntology(\r\n args.apiKey\r\n );\r\n const queryTime = Date.now() - startTime;\r\n\r\n // Format the result according to MCP standards\r\n const formattedResult: MCPResponse = {\r\n data: result,\r\n metadata: {\r\n timestamp: new Date().toISOString(),\r\n queryTime,\r\n provider: 'EE MCP Server',\r\n source: 'EE Semantic Graphs'\r\n }\r\n };\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(formattedResult),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString(),\r\n queryTime\r\n }\r\n };\r\n } catch (error: any) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: error.message }),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString()\r\n },\r\n isError: true\r\n };\r\n }\r\n});\r\n\r\n// Query the Model Graph\r\nserver.tool(\"query-ontology-semantics\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args, extra) => {\r\n if (args.apiKey === null || args.apiKey === undefined || args.apiKey === \"*\") {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: \"API key is required\" }),\r\n },\r\n ],\r\n isError: true\r\n };\r\n }\r\n\r\n try {\r\n const startTime = Date.now();\r\n\r\n // Execute the query using FalkorDB service\r\n const response = await falkorDBService.executeOntologyGraphQuery(\r\n args.query,\r\n args.apiKey\r\n );\r\n const queryTime = Date.now() - startTime;\r\n\r\n // Format the result according to MCP standards\r\n const formattedResult: MCPResponse = {\r\n data: response.result,\r\n metadata: {\r\n timestamp: new Date().toISOString(),\r\n queryTime,\r\n provider: 'EE MCP Server',\r\n source: 'EE Semantic Graphs'\r\n }\r\n };\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(formattedResult),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString(),\r\n queryTime\r\n }\r\n };\r\n } catch (error: any) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: error.message }),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString()\r\n },\r\n isError: true\r\n };\r\n }\r\n});\r\n\r\n// Query the Ontology Graph\r\nserver.tool(\"query-knowledge-graph\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args, extra) => {\r\n if (args.apiKey === null || args.apiKey === undefined || args.apiKey === \"*\") {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: \"API key is required\" }),\r\n },\r\n ],\r\n isError: true\r\n };\r\n }\r\n\r\n try {\r\n const startTime = Date.now();\r\n\r\n // Execute the query using FalkorDB service\r\n const response = await falkorDBService.executeGraphQuery(\r\n args.query,\r\n args.apiKey\r\n );\r\n const queryTime = Date.now() - startTime;\r\n\r\n // Format the result according to MCP standards\r\n const formattedResult: MCPResponse = {\r\n data: response.result,\r\n metadata: {\r\n timestamp: new Date().toISOString(),\r\n queryTime,\r\n provider: 'EE MCP Server',\r\n source: 'EE Semantic Graphs'\r\n }\r\n };\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(formattedResult),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString(),\r\n queryTime\r\n }\r\n };\r\n } catch (error: any) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: error.message }),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString()\r\n },\r\n isError: true\r\n };\r\n }\r\n});\r\n\r\n// Start receiving messages on stdin and sending messages on stdout\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n console.error(\"EE MCP Server running on stdio\");\r\n}\r\n\r\nprocess.on('SIGTERM', async () => {\r\n console.log('SIGTERM received. Shutting down gracefully...');\r\n // Close database connections\r\n await falkorDBService.close();\r\n process.exit(0);\r\n});\r\n\r\nprocess.on('SIGINT', async () => {\r\n console.log('SIGINT received. Shutting down gracefully...');\r\n // Close database connections\r\n await falkorDBService.close();\r\n process.exit(0);\r\n});\r\n\r\nmain().catch((error) => {\r\n console.error(\"Fatal error in main():\", error);\r\n process.exit(1);\r\n});\r\n\r\n"],"mappings":"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","names":[]}