on main help sign in
fix(mcp): client being killed (#1419)
5a7c715Carlos Alexandro Becker
internal/agent/coordinator.go+2−1
@@ -362,7 +362,7 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan
362 }
362 }
363 if len(agent.AllowedMCP) == 0 {
363 if len(agent.AllowedMCP) == 0 {
364 // No MCPs allowed
364 // No MCPs allowed
365− slog.Warn("MCPs not allowed")
365+ slog.Debug("no MCPs allowed", "tool", tool.Name(), "agent", agent.Name)
366 break
366 break
367 }
367 }
368
368
@@ -374,6 +374,7 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan
374 filteredTools = append(filteredTools, tool)
374 filteredTools = append(filteredTools, tool)
375 }
375 }
376 }
376 }
377+ slog.Debug("MCP not allowed", "tool", tool.Name(), "agent", agent.Name)
377 }
378 }
378 slices.SortFunc(filteredTools, func(a, b fantasy.AgentTool) int {
379 slices.SortFunc(filteredTools, func(a, b fantasy.AgentTool) int {
379 return strings.Compare(a.Info().Name, b.Info().Name)
380 return strings.Compare(a.Info().Name, b.Info().Name)
internal/agent/tools/mcp/init.go+3−6
@@ -109,8 +109,8 @@ func GetState(name string) (ClientInfo, bool) {
109// Close closes all MCP clients. This should be called during application shutdown.
109// Close closes all MCP clients. This should be called during application shutdown.
110func Close() error {
110func Close() error {
111 var errs []error
111 var errs []error
112− for name, c := range sessions.Seq2() {
112+ for name, session := range sessions.Seq2() {
113− if err := c.Close(); err != nil &&
113+ if err := session.Close(); err != nil &&
114 !errors.Is(err, io.EOF) &&
114 !errors.Is(err, io.EOF) &&
115 !errors.Is(err, context.Canceled) &&
115 !errors.Is(err, context.Canceled) &&
116 err.Error() != "signal: killed" {
116 err.Error() != "signal: killed" {
@@ -154,9 +154,7 @@ func Initialize(ctx context.Context, permissions permission.Service, cfg *config
154 }
154 }
155 }()
155 }()
156
156
157− ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m))
157+ // createSession handles its own timeout internally.
158− defer cancel()
159−
160 session, err := createSession(ctx, name, m, cfg.Resolver())
158 session, err := createSession(ctx, name, m, cfg.Resolver())
161 if err != nil {
159 if err != nil {
162 return
160 return
@@ -233,7 +231,6 @@ func updateState(name string, state State, err error, client *mcp.ClientSession,
233 case StateConnected:
231 case StateConnected:
234 info.ConnectedAt = time.Now()
232 info.ConnectedAt = time.Now()
235 case StateError:
233 case StateError:
236− updateTools(name, nil)
237 sessions.Del(name)
234 sessions.Del(name)
238 }
235 }
239 states.Set(name, info)
236 states.Set(name, info)