UNPKG

@agentics.org/sparc2

Version:

SPARC 2.0 - Autonomous Vector Coding Agent + MCP. SPARC 2.0, vectorized AI code analysis, is an intelligent coding agent framework built to automate and streamline software development. It combines secure execution environments, and version control into

230 lines (205 loc) 6.8 kB
#!/usr/bin/env node /** * SPARC2 MCP Wrapper Script * * This script provides a simplified MCP server implementation that works * in both local and global installations. */ import { spawn, execSync } from 'child_process'; import path from 'path'; import fs from 'fs'; import { fileURLToPath } from 'url'; import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js"; import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"; // Get the directory of this script const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // ANSI color codes for terminal output const colors = { red: '\x1b[31m', green: '\x1b[32m', yellow: '\x1b[33m', blue: '\x1b[34m', magenta: '\x1b[35m', cyan: '\x1b[36m', reset: '\x1b[0m' }; // Log the current directory for debugging console.log(`${colors.blue}MCP Wrapper running from: ${__dirname}${colors.reset}`); /** * Check if Deno is installed * @returns {boolean} True if Deno is installed, false otherwise */ function isDenoInstalled() { try { execSync('deno --version', { stdio: 'ignore' }); return true; } catch (error) { return false; } } /** * Print Deno installation instructions */ function printDenoInstallInstructions() { console.log(`${colors.red}Error: Deno is required but not installed.${colors.reset}`); console.log(`${colors.yellow}Please install Deno using one of the following methods:${colors.reset}`); console.log(`\n${colors.blue}Linux/macOS:${colors.reset}`); console.log(` curl -fsSL https://deno.land/install.sh | sh`); console.log(`\n${colors.blue}Windows (PowerShell):${colors.reset}`); console.log(` irm https://deno.land/install.ps1 | iex`); // Check if the install script exists const installScriptPath = path.join(__dirname, 'install-deno.sh'); if (fs.existsSync(installScriptPath)) { console.log(`\n${colors.green}Or run the included installation script:${colors.reset}`); console.log(` ${installScriptPath}`); } console.log(`\n${colors.yellow}For more information, visit: https://deno.land/#installation${colors.reset}`); console.log(`\n${colors.cyan}After installing Deno, you may need to restart your terminal or add Deno to your PATH.${colors.reset}`); } /** * Check if we're running from a global installation (node_modules) * @returns {boolean} True if running from node_modules, false otherwise */ function isRunningFromNodeModules() { // Force simplified mode for now return true; } /** * Run a simplified MCP server directly */ function runSimplifiedMcpServer() { console.log(`${colors.yellow}Running simplified MCP server from global installation${colors.reset}`); // Create the MCP server const server = new Server( { name: "sparc2-mcp", version: "2.0.5", }, { capabilities: { tools: {}, }, }, ); // Set up the ListTools request handler server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "analyze_code", description: "Analyze code files for issues and improvements", inputSchema: { type: "object", properties: { files: { type: "array", items: { type: "string" }, description: "List of file paths to analyze" } } } }, { name: "modify_code", description: "Apply suggested modifications to code files", inputSchema: { type: "object", properties: { files: { type: "array", items: { type: "string" }, description: "List of file paths to modify" }, changes: { type: "array", items: { type: "object", properties: { file: { type: "string" }, diff: { type: "string" } } }, description: "List of changes to apply" } } } } ] }; }); // Set up the CallTool request handler server.setRequestHandler(CallToolRequestSchema, async (request) => { const toolName = request.params.name; return { content: [ { type: "text", text: `This is a simplified MCP server running from a global installation.\n\nThe tool "${toolName}" was called with arguments:\n${JSON.stringify(request.params.arguments, null, 2)}\n\nFor full functionality, please run SPARC2 from a local installation.`, }, ], }; }); // Set up error handler server.onerror = (error) => { console.error(`[MCP Server Error] ${error}`); }; // Connect to the stdio transport console.log(`${colors.blue}Connecting to stdio transport...${colors.reset}`); const transport = new StdioServerTransport(); server.connect(transport).then(() => { console.log(`${colors.green}SPARC2 MCP server running on stdio${colors.reset}`); }).catch((error) => { console.error(`${colors.red}Failed to connect to stdio transport: ${error.message}${colors.reset}`); process.exit(1); }); // Handle process exit process.on("SIGINT", async () => { console.log(`${colors.yellow}Shutting down...${colors.reset}`); await server.close(); process.exit(0); }); } /** * Run the full MCP server wrapper */ function runFullMcpServer() { console.log(`${colors.green}Deno is installed. Starting SPARC2 MCP server...${colors.reset}`); // Path to the actual MCP server wrapper const mcpServerWrapperPath = path.join(__dirname, 'src', 'mcp', 'mcpServerWrapper.js'); // Spawn the MCP server process const mcpProcess = spawn('node', [mcpServerWrapperPath], { stdio: 'inherit', env: process.env }); // Handle process exit mcpProcess.on('exit', (code) => { if (code !== 0) { console.log(`${colors.red}MCP server exited with code ${code}${colors.reset}`); process.exit(code); } }); // Forward signals to the child process ['SIGINT', 'SIGTERM'].forEach(signal => { process.on(signal, () => { mcpProcess.kill(signal); }); }); } // Main execution if (!isDenoInstalled()) { printDenoInstallInstructions(); process.exit(1); } // If running from node_modules, use the simplified MCP server if (isRunningFromNodeModules()) { runSimplifiedMcpServer(); } else { runFullMcpServer(); }