UNPKG

mem100x

Version:

⚡ The FASTEST MCP memory server ever built - 66k+ entities/sec with intelligent context detection

259 lines 11.5 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const types_js_1 = require("@modelcontextprotocol/sdk/types.js"); const database_js_1 = require("./database.js"); const os_1 = require("os"); const path_1 = require("path"); const fast_json_js_1 = require("./utils/fast-json.js"); const tool_definitions_js_1 = require("./tool-definitions.js"); async function main() { // Initialize high-performance SQLite database const dbPath = process.env.MEMORY_DB || (0, path_1.join)((0, os_1.homedir)(), '.mem100x', 'memory.db'); const db = new database_js_1.MemoryDatabase(dbPath); const server = new index_js_1.Server({ name: 'mem100x', version: '1.0.0', }, { capabilities: { tools: {}, }, }); server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => { return { tools: (0, tool_definitions_js_1.getAllToolDefinitions)(), }; }); server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { switch (name) { case 'create_entities': { const { entities } = args; const startTime = performance.now(); const created = db.createEntities(entities); const duration = performance.now() - startTime; const rate = Math.round(entities.length / (duration / 1000)); return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ created, performance: { duration: `${duration.toFixed(2)}ms`, rate: `${rate} entities/sec` } }), }, ], }; } case 'search_nodes': { const { query, limit } = args; const startTime = performance.now(); const results = db.searchNodes({ query, limit }); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ ...results, performance: { duration: `${duration.toFixed(2)}ms`, resultCount: results.entities.length } }), }, ], }; } case 'read_graph': { const { limit } = args; const startTime = performance.now(); const graph = db.readGraph(limit, 0); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ ...graph, performance: { duration: `${duration.toFixed(2)}ms`, entityCount: graph.entities.length, relationCount: graph.relations.length } }), }, ], }; } case 'create_relations': { const { relations } = args; const startTime = performance.now(); const created = db.createRelations(relations); const duration = performance.now() - startTime; const rate = Math.round(relations.length / (duration / 1000)); return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ created, performance: { duration: `${duration.toFixed(2)}ms`, rate: `${rate} relations/sec` } }), }, ], }; } case 'add_observations': { const { observations } = args; const startTime = performance.now(); db.addObservations(observations); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ success: true, observationsAdded: observations.length, performance: { duration: `${duration.toFixed(2)}ms` } }), }, ], }; } case 'delete_entities': { const { entityNames } = args; const startTime = performance.now(); db.deleteEntities(entityNames); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ success: true, deletedCount: entityNames.length, performance: { duration: `${duration.toFixed(2)}ms` } }), }, ], }; } case 'delete_observations': { const { deletions } = args; const startTime = performance.now(); db.deleteObservations(deletions); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ success: true, deletionsProcessed: deletions.length, performance: { duration: `${duration.toFixed(2)}ms` } }), }, ], }; } case 'delete_relations': { const { relations } = args; const startTime = performance.now(); db.deleteRelations(relations); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ success: true, deletedCount: relations.length, performance: { duration: `${duration.toFixed(2)}ms` } }), }, ], }; } case 'open_nodes': { const { names } = args; const startTime = performance.now(); const results = db.openNodes(names); const duration = performance.now() - startTime; return { content: [ { type: 'text', text: (0, fast_json_js_1.stringifyToolResponse)({ ...results, performance: { duration: `${duration.toFixed(2)}ms`, requestedCount: names.length, foundCount: results.entities.length } }), }, ], }; } default: throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } } catch (error) { throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`); } }); // Global error handlers process.on('uncaughtException', (error) => { console.error('Uncaught Exception:', error); console.error('Stack:', error.stack); db.close(); // Give time for error to be logged before exiting setTimeout(() => process.exit(1), 100); }); process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection at:', promise); console.error('Reason:', reason); db.close(); // Give time for error to be logged before exiting setTimeout(() => process.exit(1), 100); }); const transport = new stdio_js_1.StdioServerTransport(); // Graceful shutdown process.on('SIGINT', () => { console.error('Shutting down gracefully...'); db.close(); process.exit(0); }); process.on('SIGTERM', () => { console.error('Shutting down gracefully...'); db.close(); process.exit(0); }); await server.connect(transport); console.error('⚡ Mem100x MCP server started - The fastest memory server in the universe!'); } main().catch((error) => { console.error('Server error:', error); process.exit(1); }); //# sourceMappingURL=index.js.map