@aurracloud/mcp-cli
Version:
A command-line tool to install, manage, and setup MCP (Model Context Protocol) servers with Docker support
133 lines • 5.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.uninstallCommand = uninstallCommand;
const logger_1 = require("../utils/logger");
const client_ops_1 = require("../client-ops");
const git_1 = require("../git");
/**
* Resolves the actual package name from a GitHub URL or npm package name
*/
async function resolvePackageName(packageName) {
// If it's a GitHub URL, try to get the actual package name from package.json
if (packageName.includes('github.com')) {
try {
logger_1.logger.info(`Resolving package name from GitHub repository: ${packageName}`);
const gitResult = await (0, git_1.checkGitRepoExistence)(packageName);
if (gitResult.exists && gitResult.packageInfo && gitResult.clonePath) {
try {
const packageJson = gitResult.packageInfo;
if (packageJson.name) {
logger_1.logger.info(`Resolved package name from package.json: ${packageJson.name}`);
// Clean up cloned repository
(0, git_1.cleanupClonedRepo)(gitResult.clonePath);
return packageJson.name;
}
}
catch (error) {
logger_1.logger.warn(`Failed to read package name from package.json: ${error}`);
}
// Clean up cloned repository even if we couldn't read the package.json
(0, git_1.cleanupClonedRepo)(gitResult.clonePath);
}
}
catch (error) {
logger_1.logger.warn(`Failed to resolve package name from Git repository: ${error}`);
}
// Fallback: extract repository name from URL
logger_1.logger.info('Falling back to extracting repository name from URL');
const urlParts = packageName.replace(/\.git$/, '').split('/');
if (urlParts.length >= 2) {
const repoName = urlParts[urlParts.length - 1];
logger_1.logger.info(`Using repository name as fallback: ${repoName}`);
return repoName;
}
}
// For npm packages or if GitHub resolution failed, return as-is
return packageName;
}
/**
* Find installed server by checking multiple possible names
*/
function findInstalledServer(mcpServers, packageName, resolvedName) {
// Check exact match with resolved name first
if (mcpServers[resolvedName]) {
return resolvedName;
}
// Check exact match with original package name
if (mcpServers[packageName]) {
return packageName;
}
// If it's a GitHub URL, try some variations
if (packageName.includes('github.com')) {
// Try repository name without owner
const urlParts = packageName.replace(/\.git$/, '').split('/');
if (urlParts.length >= 2) {
const repoName = urlParts[urlParts.length - 1];
if (mcpServers[repoName]) {
return repoName;
}
// Try owner/repo format
const ownerRepo = `${urlParts[urlParts.length - 2]}/${repoName}`;
if (mcpServers[ownerRepo]) {
return ownerRepo;
}
}
}
// Try to find by partial match in server names
const serverNames = Object.keys(mcpServers);
// Look for servers that contain the resolved name
const partialMatch = serverNames.find(name => name.includes(resolvedName) || resolvedName.includes(name));
if (partialMatch) {
return partialMatch;
}
return null;
}
/**
* Command to uninstall an MCP server
*/
async function uninstallCommand(options) {
// Package is now a required positional argument
const packageName = options.package;
logger_1.logger.info(`Uninstalling MCP server ${packageName} from ${options.client} environment`);
try {
const config = (0, client_ops_1.readConfig)(options.client);
if (config.type === "command") {
logger_1.logger.info("Command client detected, skipping uninstallation");
return;
}
const mcpServers = config.mcpServers;
// Resolve the actual package name if it's a GitHub URL
const resolvedPackageName = await resolvePackageName(packageName);
// Find the installed server using various name matching strategies
const installedServerName = findInstalledServer(mcpServers, packageName, resolvedPackageName);
if (!installedServerName) {
logger_1.logger.warn(`MCP server not found. Tried the following names:`);
logger_1.logger.warn(` - ${packageName}`);
if (resolvedPackageName !== packageName) {
logger_1.logger.warn(` - ${resolvedPackageName}`);
}
// Show available servers for reference
const availableServers = Object.keys(mcpServers);
if (availableServers.length > 0) {
logger_1.logger.info(`Available installed servers: ${availableServers.join(', ')}`);
}
else {
logger_1.logger.info('No MCP servers are currently installed');
}
return;
}
// Remove the package from the configuration
delete mcpServers[installedServerName];
// Update the configuration file
(0, client_ops_1.writeConfig)(options.client, config);
logger_1.logger.success(`MCP server ${installedServerName} uninstalled successfully!`);
if (installedServerName !== packageName) {
logger_1.logger.info(`Note: Server was installed as "${installedServerName}" but requested as "${packageName}"`);
}
}
catch (error) {
logger_1.logger.error('Uninstallation failed', error);
process.exit(1);
}
}
//# sourceMappingURL=uninstall.js.map