@mcp-shark/mcp-shark
Version:
Aggregate multiple Model Context Protocol (MCP) servers into a single unified interface with a powerful monitoring UI. Prov deep visibility into every request and response.
99 lines (86 loc) • 2.73 kB
JavaScript
import * as fs from 'node:fs';
import { homedir } from 'node:os';
const state = { originalConfigData: null };
export function storeOriginalConfig(filePath, originalContent, backupPath) {
state.originalConfigData = { filePath, originalContent, backupPath };
}
export function restoreOriginalConfig(mcpSharkLogs, broadcastLogUpdate) {
if (state.originalConfigData && state.originalConfigData.filePath) {
try {
if (fs.existsSync(state.originalConfigData.filePath)) {
fs.writeFileSync(
state.originalConfigData.filePath,
state.originalConfigData.originalContent
);
console.log(`Restored original config to: ${state.originalConfigData.filePath}`);
state.originalConfigData = null;
return true;
}
state.originalConfigData = null;
return false;
} catch (error) {
console.error('Failed to restore original config:', error);
const timestamp = new Date().toISOString();
const errorLog = {
timestamp,
type: 'error',
line: `[RESTORE ERROR] Failed to restore: ${error.message}`,
};
mcpSharkLogs.push(errorLog);
if (mcpSharkLogs.length > 10000) {
mcpSharkLogs.shift();
}
broadcastLogUpdate(errorLog);
return false;
}
}
return false;
}
export function clearOriginalConfig() {
state.originalConfigData = null;
}
export function convertMcpServersToServers(config) {
const { mcpServers, servers } = config;
const converted = { servers: {} };
if (servers) {
converted.servers = servers;
}
if (mcpServers) {
Object.entries(mcpServers).forEach(([name, cfg]) => {
const type = cfg.type || (cfg.url ? 'http' : cfg.command ? 'stdio' : 'stdio');
converted.servers[name] = { type, ...cfg };
});
}
return converted;
}
export function extractServices(config) {
const { mcpServers, servers } = config;
const servicesMap = new Map();
if (servers) {
Object.entries(servers).forEach(([name, cfg]) => {
const type = cfg.type || (cfg.url ? 'http' : cfg.command ? 'stdio' : 'stdio');
servicesMap.set(name, {
name,
type,
url: cfg.url || null,
command: cfg.command || null,
args: cfg.args || null,
});
});
}
if (mcpServers) {
Object.entries(mcpServers).forEach(([name, cfg]) => {
if (!servicesMap.has(name)) {
const type = cfg.type || (cfg.url ? 'http' : cfg.command ? 'stdio' : 'stdio');
servicesMap.set(name, {
name,
type,
url: cfg.url || null,
command: cfg.command || null,
args: cfg.args || null,
});
}
});
}
return Array.from(servicesMap.values());
}