@@ -196,14 +196,10 @@ func (b *McpTool) Run(ctx context.Context, params tools.ToolCall) (tools.ToolRes
196196 return runTool(ctx, b.mcpName, b.tool.Name, params.Input)
197197}
198198
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) {
200200 result, err := c.ListTools(ctx, mcp.ListToolsRequest{})
201201 if err != nil {
202− slog.Error("error listing tools", "error", err)
203− updateMCPState(name, MCPStateError, err, nil, 0)
204− c.Close()
205− mcpClients.Del(name)
206− return nil
202+ return nil, err
207203 }
208204 mcpTools := make([]tools.BaseTool, 0, len(result.Tools))
209205 for _, tool := range result.Tools {
@@ -214,7 +210,7 @@ func getTools(ctx context.Context, name string, permissions permission.Service,
214210 workingDir: workingDir,
215211 })
216212 }
217− return mcpTools
213+ return mcpTools, nil
218214}
219215
220216// SubscribeMCPEvents returns a channel for MCP events
@@ -314,13 +310,21 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
314310
315311 ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m))
316312 defer cancel()
313+
317314 c, err := createAndInitializeClient(ctx, name, m, cfg.Resolver())
318315 if err != nil {
319316 return
320317 }
321− mcpClients.Set(name, c)
322318
323− tools := getTools(ctx, name, permissions, c, cfg.WorkingDir())
319+ tools, err := getTools(ctx, name, permissions, c, cfg.WorkingDir())
320+ if err != nil {
321+ slog.Error("error listing tools", "error", err)
322+ updateMCPState(name, MCPStateError, err, nil, 0)
323+ c.Close()
324+ return
325+ }
326+
327+ mcpClients.Set(name, c)
324328 updateMCPState(name, MCPStateConnected, nil, c, len(tools))
325329 result.Append(tools...)
326330 }(name, m)
@@ -341,14 +345,11 @@ func createAndInitializeClient(ctx context.Context, name string, m config.MCPCon
341345 initCtx, cancel := context.WithTimeout(ctx, timeout)
342346 defer cancel()
343347
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 {
347− updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)
348− slog.Error("error starting mcp client", "error", err, "name", name)
349− _ = c.Close()
350− return nil, err
351− }
348+ if err := c.Start(initCtx); err != nil {
349+ updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)
350+ slog.Error("error starting mcp client", "error", err, "name", name)
351+ _ = c.Close()
352+ return nil, err
352353 }
353354 if _, err := c.Initialize(initCtx, mcpInitRequest); err != nil {
354355 updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0)