on main help sign in
fix: mcps loading in non interactive mode (#1894)
commitda3e44cc085963253af4425cef849e84bb16d088 authorKujtim Hoxha <kujtimii.h@gmail.com> dateFri 16 Jan 2026, 15:06 (9 months ago) parent0de0788
2 files changed+20
internal/agent/coordinator.go+6 internal/agent/tools/mcp/init.go+14
internal/agent/coordinator.go+6
@@ -20,6 +20,7 @@ import (
2020 "github.com/charmbracelet/crush/internal/agent/hyper"
2121 "github.com/charmbracelet/crush/internal/agent/prompt"
2222 "github.com/charmbracelet/crush/internal/agent/tools"
23+ "github.com/charmbracelet/crush/internal/agent/tools/mcp"
2324 "github.com/charmbracelet/crush/internal/config"
2425 "github.com/charmbracelet/crush/internal/csync"
2526 "github.com/charmbracelet/crush/internal/history"
@@ -411,6 +412,11 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan
411412 }
412413 }
413414
415+ // Wait for MCP initialization to complete before reading MCP tools.
416+ if err := mcp.WaitForInit(ctx); err != nil {
417+ return nil, fmt.Errorf("failed to wait for MCP initialization: %w", err)
418+ }
419+
414420 for _, tool := range tools.GetMCPTools(c.permissions, c.cfg.WorkingDir()) {
415421 if agent.AllowedMCP == nil {
416422 // No MCP restrictions
internal/agent/tools/mcp/init.go+14
@@ -29,6 +29,8 @@ var (
2929 sessions = csync.NewMap[string, *mcp.ClientSession]()
3030 states = csync.NewMap[string, ClientInfo]()
3131 broker = pubsub.NewBroker[Event]()
32+ initOnce sync.Once
33+ initDone = make(chan struct{})
3234)
3335
3436// State represents the current state of an MCP client
@@ -197,6 +199,18 @@ func Initialize(ctx context.Context, permissions permission.Service, cfg *config
197199 }(name, m)
198200 }
199201 wg.Wait()
202+ initOnce.Do(func() { close(initDone) })
203+}
204+
205+// WaitForInit blocks until MCP initialization is complete.
206+// If Initialize was never called, this returns immediately.
207+func WaitForInit(ctx context.Context) error {
208+ select {
209+ case <-initDone:
210+ return nil
211+ case <-ctx.Done():
212+ return ctx.Err()
213+ }
200214}
201215
202216func getOrRenewClient(ctx context.Context, name string) (*mcp.ClientSession, error) {