mcp-extended-tools
Version:
Extended tools for command execution
74 lines (61 loc) • 2.54 kB
JavaScript
const { exec } = require('child_process');
const fs = require('fs');
const path = require('path');
const terminals = new Map();
function executeCommand(command, terminalName) {
const allowedCommands = [
'npm', 'yarn', 'pnpm', 'git', 'node', 'jest', 'vitest', 'vite', 'webpack',
'python', 'pip', 'virtualenv',
'powershell', 'pwsh', 'gsudo'
];
const firstArg = command.trim().split(' ')[0];
if (!allowedCommands.includes(firstArg)) {
return Promise.reject({ error: 'Command not allowed' });
}
const terminal = terminals.get(terminalName);
if (!terminal) {
const terminalLogFile = path.join(__dirname, `${terminalName}.log`);
const logStream = fs.createWriteStream(terminalLogFile, { flags: 'a' });
const process = exec(command);
terminals.set(terminalName, { process, logStream });
process.stdout.on('data', (data) => {
logStream.write(data);
});
process.stderr.on('data', (data) => {
logStream.write(data);
});
process.on('close', (code) => {
logStream.write(`\nProcess exited with code ${code}`);
logStream.end();
terminals.delete(terminalName);
});
return Promise.resolve({ message: `Command execution started in terminal "${terminalName}"` });
} else {
return Promise.reject({ error: `Terminal "${terminalName}" is already running a command` });
}
}
function stopProcess(terminalName) {
const terminal = terminals.get(terminalName);
if (terminal) {
terminal.process.kill();
terminal.logStream.end();
terminals.delete(terminalName);
return Promise.resolve({ message: `Process in terminal "${terminalName}" has been stopped` });
} else {
return Promise.reject({ error: `No running process found in terminal "${terminalName}"` });
}
}
function getTerminalOutput(terminalName) {
const terminalLogFile = path.join(__dirname, `${terminalName}.log`);
if (fs.existsSync(terminalLogFile)) {
const output = fs.readFileSync(terminalLogFile, 'utf8');
return Promise.resolve({ output });
} else {
return Promise.reject({ error: `No output found for terminal "${terminalName}"` });
}
}
function listTerminals() {
const terminalNames = Array.from(terminals.keys());
return Promise.resolve({ terminals: terminalNames });
}
module.exports = { executeCommand, stopProcess, getTerminalOutput, listTerminals };