on main help sign in
fix: mcp client must be started (#474)
6da6500Carlos Alexandro Becker
internal/llm/agent/mcp-tools.go+25−23
@@ -132,6 +132,16 @@ func CloseMCPClients() {
132 }
132 }
133}
133}
134
134
135+var mcpInitRequest = mcp.InitializeRequest{
136+ Params: mcp.InitializeParams{
137+ ProtocolVersion: mcp.LATEST_PROTOCOL_VERSION,
138+ ClientInfo: mcp.Implementation{
139+ Name: "Crush",
140+ Version: version.Version,
141+ },
142+ },
143+}
144+
135func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *config.Config) []tools.BaseTool {
145func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *config.Config) []tools.BaseTool {
136 var wg sync.WaitGroup
146 var wg sync.WaitGroup
137 result := csync.NewSlice[tools.BaseTool]()
147 result := csync.NewSlice[tools.BaseTool]()
@@ -143,15 +153,25 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
143 wg.Add(1)
153 wg.Add(1)
144 go func(name string, m config.MCPConfig) {
154 go func(name string, m config.MCPConfig) {
145 defer wg.Done()
155 defer wg.Done()
146− c, err := doGetClient(m)
156+ c, err := createMcpClient(m)
147 if err != nil {
157 if err != nil {
148− slog.Error("error creating mcp client", "error", err)
158+ slog.Error("error creating mcp client", "error", err, "name", name)
149 return
159 return
150 }
160 }
151− if err := doInitClient(ctx, name, c); err != nil {
161+ if err := c.Start(ctx); err != nil {
152− slog.Error("error initializing mcp client", "error", err)
162+ slog.Error("error starting mcp client", "error", err, "name", name)
163+ _ = c.Close()
153 return
164 return
154 }
165 }
166+ if _, err := c.Initialize(ctx, mcpInitRequest); err != nil {
167+ slog.Error("error initializing mcp client", "error", err, "name", name)
168+ _ = c.Close()
169+ return
170+ }
171+
172+ slog.Info("Initialized mcp client", "name", name)
173+ mcpClients.Set(name, c)
174+
155 result.Append(getTools(ctx, name, permissions, c, cfg.WorkingDir())...)
175 result.Append(getTools(ctx, name, permissions, c, cfg.WorkingDir())...)
156 }(name, m)
176 }(name, m)
157 }
177 }
@@ -159,25 +179,7 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
159 return slices.Collect(result.Seq())
179 return slices.Collect(result.Seq())
160}
180}
161
181
162−func doInitClient(ctx context.Context, name string, c *client.Client) error {
163− initRequest := mcp.InitializeRequest{
164− Params: mcp.InitializeParams{
165− ProtocolVersion: mcp.LATEST_PROTOCOL_VERSION,
166− ClientInfo: mcp.Implementation{
167− Name: "Crush",
168− Version: version.Version,
169− },
170− },
171− }
172− if _, err := c.Initialize(ctx, initRequest); err != nil {
173− c.Close()
174− return err
175− }
176− mcpClients.Set(name, c)
177− return nil
178−}
179−
180−func doGetClient(m config.MCPConfig) (*client.Client, error) {
182+func createMcpClient(m config.MCPConfig) (*client.Client, error) {
181 switch m.Type {
183 switch m.Type {
182 case config.MCPStdio:
184 case config.MCPStdio:
183 return client.NewStdioMCPClient(
185 return client.NewStdioMCPClient(