connectAll runs connectServer in parallel for the given configs. Failed connects are logged and skipped.
(ctx context.Context, toConnect []ServerConfig)
| 620 | // connectAll runs connectServer in parallel for the given configs. |
| 621 | // Failed connects are logged and skipped. |
| 622 | func (m *Manager) connectAll(ctx context.Context, toConnect []ServerConfig) []connectedServer { |
| 623 | logger := m.logger.With(agentchat.Fields(ctx)...) |
| 624 | |
| 625 | if hook := m.connectStartedHook; hook != nil { |
| 626 | hook() |
| 627 | } |
| 628 | |
| 629 | var ( |
| 630 | mu sync.Mutex |
| 631 | connected []connectedServer |
| 632 | ) |
| 633 | var eg errgroup.Group |
| 634 | for _, cfg := range toConnect { |
| 635 | eg.Go(func() error { |
| 636 | c, err := m.connectServer(ctx, cfg) |
| 637 | if err != nil { |
| 638 | logger.Warn(ctx, "skipping MCP server", |
| 639 | slog.F("server", cfg.Name), |
| 640 | slog.F("transport", cfg.Transport), |
| 641 | slog.Error(err), |
| 642 | ) |
| 643 | return nil // Don't fail the group. |
| 644 | } |
| 645 | mu.Lock() |
| 646 | connected = append(connected, connectedServer{ |
| 647 | name: cfg.Name, config: cfg, client: c, |
| 648 | }) |
| 649 | mu.Unlock() |
| 650 | return nil |
| 651 | }) |
| 652 | } |
| 653 | _ = eg.Wait() |
| 654 | return connected |
| 655 | } |
| 656 | |
| 657 | // installServers builds the new server map from diff.keep and the |
| 658 | // connected list, falling back to diff.prev when a connect failed. |