@skyramp/mcp
Version:
Skyramp MCP (Model Context Protocol) Server - AI-powered test generation and execution
112 lines (111 loc) • 4.75 kB
JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { registerStartTraceCollectionPrompt } from "./prompts/startTraceCollectionPrompts.js";
import { registerTraceTool } from "./tools/trace/startTraceCollectionTool.js";
import { registerTraceStopTool } from "./tools/trace/stopTraceCollectionTool.js";
import { registerExecuteSkyrampTestTool } from "./tools/executeSkyrampTestTool.js";
import { registerTestGenerationPrompt } from "./prompts/testGenerationPrompt.js";
import { logger } from "./utils/logger.js";
import { registerUITestTool } from "./tools/generate-tests/generateUIRestTool.js";
import { registerSmokeTestTool } from "./tools/generate-tests/generateSmokeRestTool.js";
import { registerFuzzTestTool } from "./tools/generate-tests/generateFuzzRestTool.js";
import { registerContractTestTool } from "./tools/generate-tests/generateContractRestTool.js";
import { registerLoadTestTool } from "./tools/generate-tests/generateLoadRestTool.js";
import { registerIntegrationTestTool } from "./tools/generate-tests/generateIntegrationRestTool.js";
import { registerE2ETestTool } from "./tools/generate-tests/generateE2ERestTool.js";
import { registerLoginTool } from "./tools/auth/loginTool.js";
import { registerLogoutTool } from "./tools/auth/logoutTool.js";
import { registerFixErrorTool } from "./tools/fixErrorTool.js";
import { registerAnalyzeRepositoryTool } from "./tools/test-recommendation/analyzeRepositoryTool.js";
import { registerMapTestsTool } from "./tools/test-recommendation/mapTestsTool.js";
import { registerRecommendTestsTool } from "./tools/test-recommendation/recommendTestsTool.js";
import { registerModularizationTool } from "./tools/code-refactor/modularizationTool.js";
import { registerCodeReuseTool } from "./tools/code-refactor/codeReuseTool.js";
import { registerScenarioTestTool } from "./tools/generate-tests/generateScenarioRestTool.js";
const server = new McpServer({
name: "Skyramp MCP Server",
version: "1.0.0",
capabilities: {
tools: {
listChanged: true,
},
prompts: {
listChanged: true,
},
},
});
// Register prompts
logger.info("Starting prompt registration process");
const prompts = [
registerTestGenerationPrompt,
registerStartTraceCollectionPrompt,
];
prompts.forEach((registerPrompt) => registerPrompt(server));
logger.info("All prompts registered successfully");
// Register test generation tools
const testGenerationTools = [
registerSmokeTestTool,
registerFuzzTestTool,
registerContractTestTool,
registerLoadTestTool,
registerIntegrationTestTool,
registerE2ETestTool,
registerUITestTool,
registerScenarioTestTool,
];
testGenerationTools.forEach((registerTool) => registerTool(server));
// Register modularization and code quality tools
const codeQualityTools = [
registerModularizationTool,
registerFixErrorTool,
registerCodeReuseTool,
];
codeQualityTools.forEach((registerTool) => registerTool(server));
// Register internal/test recommendation tools (controlled by environment variable)
const enableInternalTools = process.env.SKYRAMP_ENABLE_INTERNAL_TOOLS === "true";
if (enableInternalTools) {
logger.info("Internal tools enabled - registering test recommendation tools");
registerAnalyzeRepositoryTool(server);
registerMapTestsTool(server);
registerRecommendTestsTool(server);
}
else {
logger.info("Internal tools disabled. Set SKYRAMP_ENABLE_INTERNAL_TOOLS=true to enable.");
}
// Register other Skyramp tools
const infrastructureTools = [
registerLoginTool,
registerLogoutTool,
registerExecuteSkyrampTestTool,
registerTraceTool,
registerTraceStopTool,
];
infrastructureTools.forEach((registerTool) => registerTool(server));
// Start MCP server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
logger.info("MCP Server started successfully");
// Listen for stdin closure (parent process disconnected)
process.stdin.on("end", () => {
logger.info("STDIN closed, parent process disconnected. Exiting...");
process.exit(0);
});
// Handle process termination signals
process.on("SIGTERM", () => {
logger.info("Received SIGTERM, shutting down gracefully...");
process.exit(0);
});
process.on("SIGINT", () => {
logger.info("Received SIGINT, shutting down gracefully...");
process.exit(0);
});
}
main().catch((error) => {
logger.critical("Fatal error in main()", {
error: error.message,
stack: error.stack,
});
process.exit(1);
});