mem100x
Version:
⚡ The FASTEST MCP memory server ever built - 66k+ entities/sec with intelligent context detection
259 lines • 11.5 kB
JavaScript
;
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