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