server.ts•2.29 kB
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 { logger } from "./utils/logger.js";
import { tools } from "./tools/index.js";
export class BucketeerMCPServer {
private server: Server;
constructor() {
this.server = new Server(
{
name: "bucketeer-mcp-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
},
);
this.setupHandlers();
this.setupErrorHandling();
}
private setupHandlers() {
// Handle list tools request
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
logger.debug("Listing available tools");
return {
tools: tools.map((tool) => ({
name: tool.name,
description: tool.description,
inputSchema: tool.inputSchema,
})),
};
});
// Handle tool calls
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
logger.info(`Tool called: ${name}`, { arguments: args });
const tool = tools.find((t) => t.name === name);
if (!tool) {
logger.error(`Tool not found: ${name}`);
throw new Error(`Tool not found: ${name}`);
}
try {
const result = await tool.handler(args);
logger.info(`Tool ${name} executed successfully`);
return result;
} catch (error) {
logger.error(`Tool ${name} execution failed`, error);
throw error;
}
});
}
private setupErrorHandling() {
this.server.onerror = (error) => {
logger.error("MCP server error", error);
};
process.on("SIGINT", async () => {
logger.info("Shutting down MCP server...");
await this.stop();
process.exit(0);
});
process.on("SIGTERM", async () => {
logger.info("Shutting down MCP server...");
await this.stop();
process.exit(0);
});
}
async start() {
logger.info("Starting Bucketeer MCP server...");
const transport = new StdioServerTransport();
await this.server.connect(transport);
logger.info("Bucketeer MCP server started successfully");
}
async stop() {
await this.server.close();
logger.info("Bucketeer MCP server stopped");
}
}