feat: add API endpoints for managing servers and settings

This commit is contained in:
samanhappy
2025-04-01 18:24:14 +08:00
parent 251f03831f
commit 13b2ff4234
3 changed files with 424 additions and 7 deletions

View File

@@ -45,6 +45,18 @@ function loadSettings(): McpSettings {
}
}
// Function to save settings to file
export function saveSettings(settings: McpSettings): boolean {
const settingsPath = path.resolve(process.cwd(), 'mcp_settings.json');
try {
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
return true;
} catch (error) {
console.error(`Failed to save settings to ${settingsPath}:`, error);
return false;
}
}
// Initialize clients and transports from settings
function initializeClientsFromSettings(): {
servers: string[];
@@ -98,7 +110,7 @@ function initializeClientsFromSettings(): {
}
// Initialize clients and transports
const { servers, clients, transports } = initializeClientsFromSettings();
let { servers, clients, transports } = initializeClientsFromSettings();
// Keep track of connected clients and their tools
const clientTools: { [clientIndex: number]: ToolInfo[] } = {};
@@ -149,6 +161,78 @@ export function getServersInfo(): ServerInfo[] {
}));
}
// Add function to get all server settings
export function getServersSettings(): McpSettings {
return loadSettings();
}
// Add function to add a new server
export async function addServer(mcpServer: McpServer, name: string, config: { url?: string; command?: string; args?: string[]; env?: Record<string, string> }): Promise<boolean> {
try {
// Load current settings
const settings = loadSettings();
// Check if server with this name already exists
if (settings.mcpServers[name]) {
return false;
}
// Add new server to settings
settings.mcpServers[name] = config;
// Save updated settings
if (!saveSettings(settings)) {
return false;
}
// Re-initialize clients with updated settings
const result = initializeClientsFromSettings();
servers = result.servers;
clients = result.clients;
transports = result.transports;
// Register tools for the new server
await registerAllTools(mcpServer);
return true;
} catch (error) {
console.error(`Failed to add server: ${name}`, error);
return false;
}
}
// Add function to remove a server
export function removeServer(name: string): boolean {
try {
// Load current settings
const settings = loadSettings();
// Check if server exists
if (!settings.mcpServers[name]) {
return false;
}
// Remove server from settings
delete settings.mcpServers[name];
// Save updated settings
if (!saveSettings(settings)) {
return false;
}
// Re-initialize clients with updated settings
const result = initializeClientsFromSettings();
servers = result.servers;
clients = result.clients;
transports = result.transports;
return true;
} catch (error) {
console.error(`Failed to remove server: ${name}`, error);
return false;
}
}
function cast(inputSchema: unknown): ZodRawShape {
if (typeof inputSchema !== 'object' || inputSchema === null) {
throw new Error('Invalid input schema');