UNPKG

fusion-mcp-cli

Version:

CLI tool for Fusion MCP Hub - Manage custom and community MCP servers. Web App: https://fusion-mcp-hub.vercel.app (General) | https://fusion-mcp-prod.isc-code-connect.dal.app.cirrus.ibm.com (IBM)

303 lines 10.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCommunityServersDir = getCommunityServersDir; exports.getCommunityServerPath = getCommunityServerPath; exports.saveCommunityServerMetadata = saveCommunityServerMetadata; exports.getCommunityServerMetadata = getCommunityServerMetadata; exports.listInstalledCommunityServers = listInstalledCommunityServers; exports.installCommunityServer = installCommunityServer; exports.uninstallCommunityServer = uninstallCommunityServer; const fs = __importStar(require("fs-extra")); const path = __importStar(require("path")); const os = __importStar(require("os")); const child_process_1 = require("child_process"); const util_1 = require("util"); const ora_1 = __importDefault(require("ora")); const chalk_1 = __importDefault(require("chalk")); const execPromise = (0, util_1.promisify)(child_process_1.exec); /** * Get the community servers directory */ function getCommunityServersDir() { return path.join(os.homedir(), ".fusion-mcp", "community"); } /** * Get the path for a specific community server */ function getCommunityServerPath(serverId) { return path.join(getCommunityServersDir(), serverId); } /** * Get metadata file path for a community server */ function getMetadataPath(serverId) { return path.join(getCommunityServerPath(serverId), ".fusion-mcp-metadata.json"); } /** * Save community server metadata */ async function saveCommunityServerMetadata(serverId, metadata) { const metadataPath = getMetadataPath(serverId); await fs.ensureDir(path.dirname(metadataPath)); await fs.writeJson(metadataPath, metadata, { spaces: 2 }); } /** * Get community server metadata */ async function getCommunityServerMetadata(serverId) { const metadataPath = getMetadataPath(serverId); if (!(await fs.pathExists(metadataPath))) { return null; } return await fs.readJson(metadataPath); } /** * List all installed community servers */ async function listInstalledCommunityServers() { const communityDir = getCommunityServersDir(); if (!(await fs.pathExists(communityDir))) { return []; } const entries = await fs.readdir(communityDir, { withFileTypes: true }); const servers = []; for (const entry of entries) { if (entry.isDirectory()) { const metadata = await getCommunityServerMetadata(entry.name); if (metadata) { servers.push(metadata); } } } return servers; } /** * Check if a command exists */ async function commandExists(command) { try { await execPromise(`which ${command}`); return true; } catch { return false; } } /** * Install NPM package */ async function installNpmPackage(packageName, targetDir, skipDeps) { const spinner = (0, ora_1.default)(`Installing npm package: ${packageName}`).start(); try { // Check if npm is available if (!(await commandExists("npm"))) { throw new Error("npm is not installed. Please install Node.js and npm first."); } // Create target directory await fs.ensureDir(targetDir); // Initialize package.json if it doesn't exist const packageJsonPath = path.join(targetDir, "package.json"); if (!(await fs.pathExists(packageJsonPath))) { await fs.writeJson(packageJsonPath, { name: "fusion-mcp-community-server", version: "1.0.0", private: true, }, { spaces: 2 }); } if (!skipDeps) { // Install the package spinner.text = `Installing ${packageName}...`; await execPromise(`npm install ${packageName}`, { cwd: targetDir }); spinner.succeed(`Installed ${packageName}`); } else { spinner.info(`Skipped dependency installation for ${packageName}`); } return { success: true }; } catch (error) { spinner.fail(`Failed to install ${packageName}`); return { success: false, error: error.message || "Unknown error during npm installation", }; } } /** * Clone GitHub repository */ async function cloneGitRepo(repoUrl, targetDir, skipDeps) { const spinner = (0, ora_1.default)(`Cloning repository: ${repoUrl}`).start(); try { // Check if git is available if (!(await commandExists("git"))) { throw new Error("git is not installed. Please install git first."); } // Clone the repository await execPromise(`git clone ${repoUrl} ${targetDir}`); spinner.succeed("Repository cloned"); if (!skipDeps) { // Check if package.json exists and install dependencies const packageJsonPath = path.join(targetDir, "package.json"); if (await fs.pathExists(packageJsonPath)) { spinner.start("Installing dependencies..."); await execPromise("npm install", { cwd: targetDir }); spinner.succeed("Dependencies installed"); } } else { spinner.info("Skipped dependency installation"); } return { success: true }; } catch (error) { spinner.fail("Failed to clone repository"); return { success: false, error: error.message || "Unknown error during git clone", }; } } /** * Install community server */ async function installCommunityServer(server, projectMode, skipDeps) { try { const targetDir = projectMode ? path.join(process.cwd(), ".fusion-mcp", "community", server.id) : getCommunityServerPath(server.id); console.log(chalk_1.default.gray(`\nTarget directory: ${targetDir}`)); // Handle different installation methods if (server.hostingType === "remote") { // Remote servers don't need installation console.log(chalk_1.default.blue("\nℹ️ Remote server - no local installation needed")); // Just save metadata const metadata = { serverId: server.id, serverType: "community", serverName: server.name, version: server.version, installedAt: new Date().toISOString(), installMethod: "remote", hostingType: server.hostingType, }; await saveCommunityServerMetadata(server.id, metadata); return { success: true, location: "Remote server (no local installation)", }; } else if (server.npmPackage) { // Install via npm const result = await installNpmPackage(server.npmPackage, targetDir, skipDeps); if (!result.success) { return result; } // Save metadata const metadata = { serverId: server.id, serverType: "community", serverName: server.name, version: server.version, installedAt: new Date().toISOString(), npmPackage: server.npmPackage, installMethod: "npm", hostingType: server.hostingType, }; await saveCommunityServerMetadata(server.id, metadata); return { success: true, location: targetDir }; } else if (server.githubUrl) { // Clone from GitHub const result = await cloneGitRepo(server.githubUrl, targetDir, skipDeps); if (!result.success) { return result; } // Save metadata const metadata = { serverId: server.id, serverType: "community", serverName: server.name, version: server.version, installedAt: new Date().toISOString(), githubUrl: server.githubUrl, installMethod: "git", hostingType: server.hostingType, }; await saveCommunityServerMetadata(server.id, metadata); return { success: true, location: targetDir }; } else { return { success: false, error: "No installation method available (no npm package or GitHub URL)", }; } } catch (error) { return { success: false, error: error.message || "Unknown error during installation", }; } } /** * Uninstall community server */ async function uninstallCommunityServer(serverId) { try { const serverPath = getCommunityServerPath(serverId); if (!(await fs.pathExists(serverPath))) { return { success: false, error: "Server not found or not installed", }; } // Remove the entire directory await fs.remove(serverPath); return { success: true }; } catch (error) { return { success: false, error: error.message || "Unknown error during uninstallation", }; } } //# sourceMappingURL=community.js.map