Skip to main content
Glama
devlimelabs

MCP Environment & Installation Manager

by devlimelabs

localize-mcp-server

Configure and install MCP servers locally using specific packages and settings from a configuration file.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
configPathYesPath to configuration file
serverNameYesName of the server in the configuration
packageNameYesPackage name to use

Implementation Reference

  • Handler function for the 'localize-mcp-server' tool. Performs input validation (non-empty strings) and delegates the core logic to watcherService.updateServerConfig, returning success response or throwing errors.
    async ({ configPath, serverName, packageName }, extra) => { if (!configPath.trim()) { throw new Error("Config path cannot be empty"); } if (!serverName.trim()) { throw new Error("Server name cannot be empty"); } if (!packageName.trim()) { throw new Error("Package name cannot be empty"); } const result = await watcherService.updateServerConfig(configPath, serverName, packageName); if (!result.success) { throw new Error(`Failed to update server configuration: ${result.error}`); } return { content: [ { type: "text", text: JSON.stringify({ success: true, configPath, serverName, packageName }, null, 2) } ] }; } );
  • Zod input schema defining the required parameters: configPath (string), serverName (string), packageName (string).
    { configPath: z.string().describe("Path to configuration file"), serverName: z.string().describe("Name of the server in the configuration"), packageName: z.string().describe("Package name to use") },
  • MCP server tool registration call for 'localize-mcp-server', specifying input schema and inline handler function.
    server.tool( "localize-mcp-server", { configPath: z.string().describe("Path to configuration file"), serverName: z.string().describe("Name of the server in the configuration"), packageName: z.string().describe("Package name to use") }, async ({ configPath, serverName, packageName }, extra) => { if (!configPath.trim()) { throw new Error("Config path cannot be empty"); } if (!serverName.trim()) { throw new Error("Server name cannot be empty"); } if (!packageName.trim()) { throw new Error("Package name cannot be empty"); } const result = await watcherService.updateServerConfig(configPath, serverName, packageName); if (!result.success) { throw new Error(`Failed to update server configuration: ${result.error}`); } return { content: [ { type: "text", text: JSON.stringify({ success: true, configPath, serverName, packageName }, null, 2) } ] }; } );
  • Supporting method in WatcherService that implements the core localization logic: verifies package installation, parses and updates MCP config to point to local bin/dist/index.js, persists changes, updates caches and references.
    async updateServerConfig( configPath: string, serverName: string, packageName: string ): Promise<ConfigUpdateResult> { try { // Check if package is installed const installedPackage = this.packageManager.getInstalledPackage(packageName); if (!installedPackage) { return { success: false, configPath, serverName, packageName, error: `Package not installed: ${packageName}` }; } // Read the config file const config = await readJsonFileOrDefault<McpConfig>(configPath, { mcpServers: {} }); // Check if server exists if (!config.mcpServers || !config.mcpServers[serverName]) { return { success: false, configPath, serverName, packageName, error: `Server not found in config: ${serverName}` }; } // Update the command to use the local package const server = config.mcpServers[serverName]; // If bin path exists, use that if (installedPackage.binPath) { server.command = 'node'; server.args = [installedPackage.binPath]; } else { // Otherwise, use node with the package's main file server.command = 'node'; server.args = [path.join(installedPackage.localPath, 'dist/index.js')]; } // Write the updated config await fs.writeFile(configPath, JSON.stringify(config, null, 2)); // Update the cache this.configCache.set(configPath, config); // Add config reference await this.packageManager.addConfigReference(packageName, { path: configPath, platform: this.getPlatformForConfig(configPath), serverName }); return { success: true, configPath, serverName, packageName }; } catch (error) { return { success: false, configPath, serverName, packageName, error: error instanceof Error ? error.message : String(error) }; } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/devlimelabs/mcp-env-manager-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server