@insforge/install
Version:
CLI tool for installing Insforge MCP servers across different AI clients
126 lines (120 loc) • 4.51 kB
JavaScript
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();
}