From 5a7c715414e0b77e68bf5ce5ae5bf4dbc4afc241 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 11 Nov 2025 19:07:58 -0300 Subject: [PATCH] fix(mcp): client being killed (#1419) --- internal/agent/coordinator.go | 3 ++- internal/agent/tools/mcp/init.go | 9 +++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/internal/agent/coordinator.go b/internal/agent/coordinator.go index cac74097e20bc68ff041b59482a5de5603d00a73..907ec333fb4289bbdf928f5c1eb29d55fe8b1cc5 100644 --- a/internal/agent/coordinator.go +++ b/internal/agent/coordinator.go @@ -362,7 +362,7 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan } if len(agent.AllowedMCP) == 0 { // No MCPs allowed - slog.Warn("MCPs not allowed") + slog.Debug("no MCPs allowed", "tool", tool.Name(), "agent", agent.Name) break } @@ -374,6 +374,7 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan filteredTools = append(filteredTools, tool) } } + slog.Debug("MCP not allowed", "tool", tool.Name(), "agent", agent.Name) } slices.SortFunc(filteredTools, func(a, b fantasy.AgentTool) int { return strings.Compare(a.Info().Name, b.Info().Name) diff --git a/internal/agent/tools/mcp/init.go b/internal/agent/tools/mcp/init.go index cb97c0e440d87108d08a0c572c8ec2160ee5cf17..734c95e6a80fac4d2ed211bcb886b8c4377e9052 100644 --- a/internal/agent/tools/mcp/init.go +++ b/internal/agent/tools/mcp/init.go @@ -109,8 +109,8 @@ func GetState(name string) (ClientInfo, bool) { // Close closes all MCP clients. This should be called during application shutdown. func Close() error { var errs []error - for name, c := range sessions.Seq2() { - if err := c.Close(); err != nil && + for name, session := range sessions.Seq2() { + if err := session.Close(); err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, context.Canceled) && err.Error() != "signal: killed" { @@ -154,9 +154,7 @@ func Initialize(ctx context.Context, permissions permission.Service, cfg *config } }() - ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m)) - defer cancel() - + // createSession handles its own timeout internally. session, err := createSession(ctx, name, m, cfg.Resolver()) if err != nil { return @@ -233,7 +231,6 @@ func updateState(name string, state State, err error, client *mcp.ClientSession, case StateConnected: info.ConnectedAt = time.Now() case StateError: - updateTools(name, nil) sessions.Del(name) } states.Set(name, info)