UNPKG

@insforge/install

Version:

CLI tool for installing Insforge MCP servers across different AI clients

126 lines (120 loc) 4.51 kB
#!/usr/bin/env node import { clientNames, logger, readConfig, writeConfig } from "./utils.js"; import { execSync } from 'child_process'; import yargs from "yargs"; import { hideBin } from "yargs/helpers"; import pc from "picocolors"; var { green, red } = pc; function builder(yargs2) { return yargs2.option("client", { type: "string", description: "Client to use for installation", demandOption: true, choices: clientNames }).option("env", { type: "string", description: "Environment variables as key=value pairs (can be used multiple times). API_KEY is required.", array: true }); } async function handler(argv) { if (!argv.client || !clientNames.includes(argv.client)) { logger.error(`Invalid client: ${argv.client}. Available clients: ${clientNames.join(", ")}`); return; } const envVars = {}; if (argv.env && argv.env.length > 0) { for (const envVar of argv.env) { const [key, ...valueParts] = envVar.split("="); if (key && valueParts.length > 0) { envVars[key] = valueParts.join("="); } else { logger.warn(`Invalid environment variable format: ${envVar}. Expected KEY=VALUE format.`); } } } if (!envVars.API_KEY) { logger.error("API_KEY environment variable is required. Use --env API_KEY=your_key"); return; } // Add default base URL if not provided if (!envVars.API_BASE_URL) { envVars.API_BASE_URL = "http://localhost:7130"; } const name = "insforge"; const ready = true; // Auto-confirm for simplified installation if (ready) { try { const config = readConfig(argv.client); // Handle different config structures for different clients if (argv.client === "claude-code") { // Use Claude CLI for Claude Code const envArgs = Object.entries(envVars) .filter(([key]) => key !== 'CLIENT_NAME') .map(([key, value]) => { // Properly quote values for cross-platform compatibility const quotedValue = value.includes(' ') ? `"${value}"` : value; return `-e ${key}=${quotedValue}`; }) .join(' '); try { const command = `claude mcp add ${name} ${envArgs} -- npx -y @insforge/insforge-mcp@latest`; execSync(command, { stdio: 'inherit', shell: true }); } catch (error) { throw new Error(`Failed to add MCP server via Claude CLI: ${error.message}`); } } else if (argv.client === "cursor") { // Cursor uses mcpServers at root level if (!config.mcpServers) config.mcpServers = {}; config.mcpServers[name] = { command: "npx", args: ["-y", "@insforge/insforge-mcp@latest"], env: { API_KEY: envVars.API_KEY, API_BASE_URL: envVars.API_BASE_URL } }; writeConfig(config, argv.client); } else if (argv.client === "windsurf") { if (!config.mcpServers) config.mcpServers = {}; config.mcpServers[name] = { command: "npx", args: ["-y", "@insforge/insforge-mcp@latest"], env: { API_KEY: envVars.API_KEY, API_BASE_URL: envVars.API_BASE_URL } }; writeConfig(config, argv.client); } else if (argv.client === "cline" || argv.client === "roocode") { if (!config.mcpServers) config.mcpServers = {}; config.mcpServers[name] = { command: "npx", args: ["-y", "@insforge/insforge-mcp@latest"], env: { API_KEY: envVars.API_KEY, API_BASE_URL: envVars.API_BASE_URL } }; writeConfig(config, argv.client); } logger.box(green(`Successfully installed Insforge MCP server in ${argv.client}.`)); } catch (e) { logger.error(red(e.message)); } } } var parser = yargs(hideBin(process.argv)).scriptName("@insforge/install").command("install", "Install Insforge MCP server", builder, handler).help().alias("h", "help").version().alias("v", "version"); if (!process.argv.slice(2).length || process.argv[2].startsWith("--")) { parser.parse(["install", ...process.argv.slice(2)]); } else { parser.parse(); }