server.js•2.68 kB
#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import { ProcessManager } from './process-manager.js';
import { LogManager } from './log-manager.js';
import { TOOLS, handleToolCall } from './tools/index.js';
import { loadConfig } from './config.js';
const config = loadConfig();
const processManager = new ProcessManager(config);
const logManager = new LogManager(config);
processManager.on('stdout', (data) => {
logManager.addLogEntry('stdout', data, 'INFO');
});
processManager.on('stderr', (data) => {
logManager.addLogEntry('stderr', data, 'ERROR');
});
processManager.on('error', (error) => {
logManager.addLogEntry('stderr', `Process error: ${error.message}`, 'ERROR');
});
processManager.on('exit', ({ code, signal }) => {
logManager.addLogEntry('stdout',
`Process exited with code ${code} and signal ${signal}`, 'INFO');
});
const server = new Server(
{
name: config.serverName,
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: TOOLS
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
const result = await handleToolCall(
name,
args || {},
processManager,
logManager
);
return {
content: [
{
type: "text",
text: JSON.stringify(result, null, 2)
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: JSON.stringify({
error: true,
message: error.message,
stack: error.stack
}, null, 2)
}
],
isError: true
};
}
});
process.on('SIGINT', () => {
console.error('Received SIGINT, shutting down gracefully...');
processManager.destroy();
process.exit(0);
});
process.on('SIGTERM', () => {
console.error('Received SIGTERM, shutting down gracefully...');
processManager.destroy();
process.exit(0);
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error(`Gradle Tomcat MCP Server started`);
console.error(`Working directory: ${config.workingDirectory}`);
console.error(`Gradle command: ${config.gradleCommand}`);
}
main().catch((error) => {
console.error('Failed to start server:', error);
process.exit(1);
});