@z-test/memory-bank-mcp
Version:
MCP Server for managing Memory Bank
219 lines (214 loc) • 7.34 kB
JavaScript
import { MemoryBankServer } from './server/MemoryBankServer.js';
import { getLogManager, logger } from './utils/LogManager.js';
import { SftpStorageProvider } from './core/storage/SftpStorageProvider.js';
import { MemoryBankManager } from './core/MemoryBankManager.js';
import { LocalStorageProvider } from './core/storage/LocalStorageProvider.js';
/**
* Display program help
*/
function showHelp() {
console.log(`
Memory Bank MCP - MCP Server for managing Memory Bank
Usage: memory-bank-mcp [options]
Options:
--mode, -m <mode> Set execution mode (code, ask, architect, etc.)
--path, -p <path> Set project path (default: current directory)
--folder, -f <folder> Set Memory Bank folder name (default: memory-bank)
--githubProfileUrl, -g <url> Set GitHub profile URL for tracking changes
--debug, -d Enable debug mode (show detailed logs)
--help, -h Display this help
SFTP Options:
--sftp-host <host> SFTP server host
--sftp-port <port> SFTP server port (default: 22)
--sftp-user <user> SFTP username
--sftp-pass <pass> SFTP password
--sftp-key <key> SFTP private key file path
--sftp-base <path> SFTP base path for Memory Bank
Examples:
memory-bank-mcp
memory-bank-mcp --mode code
memory-bank-mcp --path /path/to/project
memory-bank-mcp --folder custom-memory-bank
memory-bank-mcp --githubProfileUrl "https://github.com/username"
memory-bank-mcp --debug
memory-bank-mcp --sftp-host example.com --sftp-user user --sftp-pass pass --sftp-base /path/to/memory-bank
For more information, visit: https://github.com/movibe/memory-bank-server
`);
process.exit(0);
}
/**
* Process command line arguments
* @returns Object with processed options
*/
function processArgs() {
const args = process.argv.slice(2);
const options = {};
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === '--mode' || arg === '-m') {
options.mode = args[++i];
}
else if (arg === '--path' || arg === '-p') {
options.projectPath = args[++i];
}
else if (arg === '--folder' || arg === '-f') {
options.folderName = args[++i];
}
else if (arg === '--githubProfileUrl' || arg === '-g') {
options.userId = args[++i];
}
else if (arg === '--debug' || arg === '-d') {
options.debug = true;
}
else if (arg === '--help' || arg === '-h') {
showHelp();
}
else if (arg === '--sftp-host') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.host = args[++i];
}
else if (arg === '--sftp-port') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.port = parseInt(args[++i], 10);
}
else if (arg === '--sftp-user') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.username = args[++i];
}
else if (arg === '--sftp-pass') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.password = args[++i];
}
else if (arg === '--sftp-key') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.privateKey = args[++i];
}
else if (arg === '--sftp-base') {
options.sftp = options.sftp || {
host: '',
port: 22,
username: '',
basePath: '/'
};
options.sftp.basePath = args[++i];
}
}
return options;
}
/**
* Creates a new Memory Bank instance
* @param projectPath Optional project path
* @param userId Optional GitHub profile URL
* @param folderName Optional folder name
* @param debugMode Optional debug mode flag
* @param storageProvider Optional storage provider
* @returns Memory Bank instance
*/
export function createMemoryBank(projectPath, userId, folderName, debugMode, storageProvider) {
return new MemoryBankManager(projectPath, userId, folderName, debugMode, storageProvider);
}
/**
* Creates a new Local Storage Provider
* @returns Local Storage Provider instance
*/
export function createLocalStorageProvider() {
return new LocalStorageProvider();
}
/**
* Creates a new SFTP Storage Provider
* @param config SFTP configuration
* @returns SFTP Storage Provider instance
*/
export function createSftpStorageProvider(config) {
return new SftpStorageProvider(config);
}
/**
* Gets the log manager instance
* @returns Log Manager instance
*/
export function getLogger() {
return getLogManager();
}
/**
* Main entry point for the Memory Bank Server
*
* This script initializes and runs the Memory Bank Server,
* which provides MCP (Model Context Protocol) tools and resources
* for managing memory banks.
*/
async function main() {
try {
const options = processArgs();
// Configure log manager
const logManager = getLogManager();
if (options.debug) {
logManager.enableDebugMode();
logger.info('Main', 'Debug mode enabled');
}
logger.info('Main', 'Starting Memory Bank Server...');
if (options.mode) {
logger.debug('Main', `Using mode: ${options.mode}`);
}
if (options.projectPath) {
logger.debug('Main', `Using project path: ${options.projectPath}`);
}
if (options.folderName) {
logger.debug('Main', `Using Memory Bank folder name: ${options.folderName}`);
}
if (options.userId) {
logger.debug('Main', `Using GitHub profile URL: ${options.userId}`);
}
if (options.sftp) {
logger.debug('Main', `Using SFTP storage: ${options.sftp.host}`);
}
let storageProvider;
if (options.sftp) {
storageProvider = new SftpStorageProvider(options.sftp);
await storageProvider.initialize(options.sftp);
}
const server = new MemoryBankServer(options.mode, options.projectPath, options.userId, options.folderName, options.debug, storageProvider);
await server.run();
logger.info('Main', 'Memory Bank Server started successfully');
}
catch (error) {
logger.error('Main', `Error starting Memory Bank server: ${error}`);
process.exit(1);
}
}
// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
process.exit(1);
});
// Start the server
main().catch(error => {
console.error('Fatal error in Memory Bank Server:', error);
process.exit(1);
});
//# sourceMappingURL=index.js.map