From 618518ddb4327b5e023334eb76ff16b664512e89 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 13:37:04 +0000 Subject: [PATCH 1/2] Fix Amp MCP config parsing to support JSON with comments - Add loadConfigForAmp function using github.com/marcozac/go-jsonc library - Modify Detect and Uninstall functions to use JSONC parsing for IsAMP configs - Resolves 'invalid character \'/\' looking for beginning of value' error - Maintains backward compatibility for non-Amp MCP configs Co-Authored-By: Rick Blalock --- internal/mcp/config.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/internal/mcp/config.go b/internal/mcp/config.go index e08c0829..125fac80 100644 --- a/internal/mcp/config.go +++ b/internal/mcp/config.go @@ -14,6 +14,7 @@ import ( "github.com/agentuity/cli/internal/util" "github.com/agentuity/go-common/logger" "github.com/agentuity/go-common/tui" + "github.com/marcozac/go-jsonc" ) const ( @@ -170,6 +171,19 @@ func loadConfig(path string) (*MCPConfig, error) { return &config, nil } +func loadConfigForAmp(path string) (*MCPConfig, error) { + content, err := os.ReadFile(path) + if err != nil { + return nil, err + } + var config MCPConfig + if err := jsonc.Unmarshal(content, &config); err != nil { + return nil, err + } + config.filename = path + return &config, nil +} + var mcpClientConfigs []MCPClientConfig // Detect detects the MCP clients that are installed and returns an array of MCP client names found. @@ -233,7 +247,11 @@ func Detect(logger logger.Logger, all bool) ([]MCPClientConfig, error) { config.Installed = true var mcpconfig *MCPConfig if util.Exists(config.ConfigLocation) { - mcpconfig, err = loadConfig(config.ConfigLocation) + if config.IsAMP { + mcpconfig, err = loadConfigForAmp(config.ConfigLocation) + } else { + mcpconfig, err = loadConfig(config.ConfigLocation) + } if err != nil { logger.Error("failed to load MCP config for %s: %s", config.Name, err) return nil, nil @@ -349,7 +367,12 @@ func Uninstall(ctx context.Context, logger logger.Logger) error { for _, config := range detected { config.ConfigLocation = strings.Replace(config.ConfigLocation, "$HOME", home, 1) if util.Exists(config.ConfigLocation) { - mcpconfig, err := loadConfig(config.ConfigLocation) + var mcpconfig *MCPConfig + if config.IsAMP { + mcpconfig, err = loadConfigForAmp(config.ConfigLocation) + } else { + mcpconfig, err = loadConfig(config.ConfigLocation) + } if err != nil { return err } From 23f6f3b2aeaf3c2c8a120d7a7ac66c102bf891dc Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 13:39:27 +0000 Subject: [PATCH 2/2] Simplify implementation to use JSONC parsing for all MCP configs - Replace loadConfig function to use jsonc.Unmarshal for all configs - Remove loadConfigForAmp function and conditional logic - All MCP configs now support JSON with comments, not just Amp configs - Addresses GitHub PR feedback to enable comments in all MCP configs Co-Authored-By: Rick Blalock --- internal/mcp/config.go | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/internal/mcp/config.go b/internal/mcp/config.go index 125fac80..f2926355 100644 --- a/internal/mcp/config.go +++ b/internal/mcp/config.go @@ -159,19 +159,6 @@ func (c *MCPConfig) Save() error { } func loadConfig(path string) (*MCPConfig, error) { - content, err := os.ReadFile(path) - if err != nil { - return nil, err - } - var config MCPConfig - if err := json.Unmarshal(content, &config); err != nil { - return nil, err - } - config.filename = path - return &config, nil -} - -func loadConfigForAmp(path string) (*MCPConfig, error) { content, err := os.ReadFile(path) if err != nil { return nil, err @@ -247,11 +234,7 @@ func Detect(logger logger.Logger, all bool) ([]MCPClientConfig, error) { config.Installed = true var mcpconfig *MCPConfig if util.Exists(config.ConfigLocation) { - if config.IsAMP { - mcpconfig, err = loadConfigForAmp(config.ConfigLocation) - } else { - mcpconfig, err = loadConfig(config.ConfigLocation) - } + mcpconfig, err = loadConfig(config.ConfigLocation) if err != nil { logger.Error("failed to load MCP config for %s: %s", config.Name, err) return nil, nil @@ -367,12 +350,7 @@ func Uninstall(ctx context.Context, logger logger.Logger) error { for _, config := range detected { config.ConfigLocation = strings.Replace(config.ConfigLocation, "$HOME", home, 1) if util.Exists(config.ConfigLocation) { - var mcpconfig *MCPConfig - if config.IsAMP { - mcpconfig, err = loadConfigForAmp(config.ConfigLocation) - } else { - mcpconfig, err = loadConfig(config.ConfigLocation) - } + mcpconfig, err := loadConfig(config.ConfigLocation) if err != nil { return err }