From 42e2e563c4e2cd57a59f74f6840e453c879925f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Sat, 15 Nov 2025 18:25:19 +0800 Subject: [PATCH] Update external_manager.go --- internal/mcp/external_manager.go | 65 ++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/internal/mcp/external_manager.go b/internal/mcp/external_manager.go index 1dac3dc2..a77a99bc 100644 --- a/internal/mcp/external_manager.go +++ b/internal/mcp/external_manager.go @@ -3,10 +3,12 @@ package mcp import ( "context" "fmt" + "strings" "sync" "time" "cyberstrike-ai/internal/config" + "github.com/google/uuid" "go.uber.org/zap" @@ -14,13 +16,13 @@ import ( // ExternalMCPManager 外部MCP管理器 type ExternalMCPManager struct { - clients map[string]ExternalMCPClient - configs map[string]config.ExternalMCPServerConfig - logger *zap.Logger - storage MonitorStorage // 可选的持久化存储 + clients map[string]ExternalMCPClient + configs map[string]config.ExternalMCPServerConfig + logger *zap.Logger + storage MonitorStorage // 可选的持久化存储 executions map[string]*ToolExecution // 执行记录 - stats map[string]*ToolStats // 工具统计信息 - mu sync.RWMutex + stats map[string]*ToolStats // 工具统计信息 + mu sync.RWMutex } // NewExternalMCPManager 创建外部MCP管理器 @@ -121,7 +123,13 @@ func (m *ExternalMCPManager) StartClient(name string) error { if hasClient { // 检查客户端是否已连接 if client, ok := m.GetClient(name); ok && client.IsConnected() { - return fmt.Errorf("客户端已连接") + // 客户端已连接,直接返回成功(目标状态已达成) + // 更新配置为启用(确保配置一致) + m.mu.Lock() + serverCfg.ExternalMCPEnable = true + m.configs[name] = serverCfg + m.mu.Unlock() + return nil } // 如果有客户端但未连接,先关闭 if client, ok := m.GetClient(name); ok { @@ -638,10 +646,45 @@ func (m *ExternalMCPManager) StartAllEnabled() { if m.isEnabled(cfg) { go func(n string, c config.ExternalMCPServerConfig) { if err := m.connectClient(n, c); err != nil { - m.logger.Error("启动外部MCP客户端失败", - zap.String("name", n), - zap.Error(err), - ) + // 检查是否是连接被拒绝的错误(服务可能还没启动) + errStr := strings.ToLower(err.Error()) + isConnectionRefused := strings.Contains(errStr, "connection refused") || + strings.Contains(errStr, "dial tcp") || + strings.Contains(errStr, "connect: connection refused") + + if isConnectionRefused { + // 连接被拒绝,说明目标服务可能还没启动,这是正常的 + // 使用 Warn 级别,提示用户这是正常的,可以通过手动启动或等待服务启动后自动连接 + fields := []zap.Field{ + zap.String("name", n), + zap.String("message", "目标服务可能尚未启动,这是正常的。服务启动后可通过界面手动连接,或等待自动重试"), + zap.Error(err), + } + + // 根据传输模式添加相应的信息 + transport := c.Transport + if transport == "" { + if c.Command != "" { + transport = "stdio" + } else if c.URL != "" { + transport = "http" + } + } + + if transport == "http" && c.URL != "" { + fields = append(fields, zap.String("url", c.URL)) + } else if transport == "stdio" && c.Command != "" { + fields = append(fields, zap.String("command", c.Command)) + } + + m.logger.Warn("外部MCP服务暂未就绪", fields...) + } else { + // 其他错误,使用 Error 级别 + m.logger.Error("启动外部MCP客户端失败", + zap.String("name", n), + zap.Error(err), + ) + } } }(name, cfg) }