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
JavaScript
;
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