localize-mcp-server
Configure and install MCP servers locally using specific packages and settings from a configuration file.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | Yes | Path to configuration file | |
| serverName | Yes | Name of the server in the configuration | |
| packageName | Yes | Package name to use |
Implementation Reference
- src/tools/watcher-tools.ts:183-216 (handler)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) } ] }; } );
- src/tools/watcher-tools.ts:178-182 (schema)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") },
- src/tools/watcher-tools.ts:176-216 (registration)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) }; } }