@@ -196,14 +196,10 @@ func (b *McpTool) Run(ctx context.Context, params tools.ToolCall) (tools.ToolRes
196 return runTool(ctx, b.mcpName, b.tool.Name, params.Input)
196 return runTool(ctx, b.mcpName, b.tool.Name, params.Input)
199−func getTools(ctx context.Context, name string, permissions permission.Service, c *client.Client, workingDir string) []tools.BaseTool {
199+func getTools(ctx context.Context, name string, permissions permission.Service, c *client.Client, workingDir string) ([]tools.BaseTool, error) {
200 result, err := c.ListTools(ctx, mcp.ListToolsRequest{})
200 result, err := c.ListTools(ctx, mcp.ListToolsRequest{})
201 if err != nil {
201 if err != nil {
202− slog.Error("error listing tools", "error", err)
203− updateMCPState(name, MCPStateError, err, nil, 0)
205− mcpClients.Del(name)
206− return nil
202+ return nil, err
208 mcpTools := make([]tools.BaseTool, 0, len(result.Tools))
204 mcpTools := make([]tools.BaseTool, 0, len(result.Tools))
209 for _, tool := range result.Tools {
205 for _, tool := range result.Tools {
@@ -214,7 +210,7 @@ func getTools(ctx context.Context, name string, permissions permission.Service,
214 workingDir: workingDir,
210 workingDir: workingDir,
217− return mcpTools
213+ return mcpTools, nil
220// SubscribeMCPEvents returns a channel for MCP events
216// SubscribeMCPEvents returns a channel for MCP events
@@ -314,13 +310,21 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
315 ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m))
311 ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m))
316 defer cancel()
312 defer cancel()
317 c, err := createAndInitializeClient(ctx, name, m, cfg.Resolver())
314 c, err := createAndInitializeClient(ctx, name, m, cfg.Resolver())
318 if err != nil {
315 if err != nil {
321− mcpClients.Set(name, c)
323− tools := getTools(ctx, name, permissions, c, cfg.WorkingDir())
319+ tools, err := getTools(ctx, name, permissions, c, cfg.WorkingDir())
321+ slog.Error("error listing tools", "error", err)
322+ updateMCPState(name, MCPStateError, err, nil, 0)
327+ mcpClients.Set(name, c)
324 updateMCPState(name, MCPStateConnected, nil, c, len(tools))
328 updateMCPState(name, MCPStateConnected, nil, c, len(tools))
325 result.Append(tools...)
329 result.Append(tools...)
326 }(name, m)
330 }(name, m)
@@ -341,14 +345,11 @@ func createAndInitializeClient(ctx context.Context, name string, m config.MCPCon
341 initCtx, cancel := context.WithTimeout(ctx, timeout)
345 initCtx, cancel := context.WithTimeout(ctx, timeout)
342 defer cancel()
346 defer cancel()
344− // Only call Start() for non-stdio clients, as stdio clients auto-start
345− if m.Type != config.MCPStdio {
346− if err := c.Start(initCtx); err != nil {
348+ if err := c.Start(initCtx); err != nil {
347− updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)
349+ updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)
348− slog.Error("error starting mcp client", "error", err, "name", name)
350+ slog.Error("error starting mcp client", "error", err, "name", name)
349− _ = c.Close()
351+ _ = c.Close()
350− return nil, err
352+ return nil, err
353 if _, err := c.Initialize(initCtx, mcpInitRequest); err != nil {
354 if _, err := c.Initialize(initCtx, mcpInitRequest); err != nil {
354 updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)
355 updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)