UNPKG

@skyramp/mcp

Version:

Skyramp MCP (Model Context Protocol) Server - AI-powered test generation and execution

112 lines (111 loc) 4.75 kB
#!/usr/bin/env node 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); });