@@ -149,7 +149,8 @@ func getOrRenewClient(ctx context.Context, name string) (*client.Client, error)
149149 return nil, fmt.Errorf("mcp '%s' not available", name)
150150 }
151151
152− m := config.Get().MCP[name]
152+ cfg := config.Get()
153+ m := cfg.MCP[name]
153154 state, _ := mcpStates.Get(name)
154155
155156 timeout := mcpTimeout(m)
@@ -161,7 +162,7 @@ func getOrRenewClient(ctx context.Context, name string) (*client.Client, error)
161162 }
162163 updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, state.ToolCount)
163164
164− c, err = createAndInitializeClient(ctx, name, m)
165+ c, err = createAndInitializeClient(ctx, name, m, cfg.Resolver())
165166 if err != nil {
166167 return nil, err
167168 }
@@ -313,7 +314,7 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
313314
314315 ctx, cancel := context.WithTimeout(ctx, mcpTimeout(m))
315316 defer cancel()
316− c, err := createAndInitializeClient(ctx, name, m)
317+ c, err := createAndInitializeClient(ctx, name, m, cfg.Resolver())
317318 if err != nil {
318319 return
319320 }
@@ -328,8 +329,8 @@ func doGetMCPTools(ctx context.Context, permissions permission.Service, cfg *con
328329 return slices.Collect(result.Seq())
329330}
330331
331−func createAndInitializeClient(ctx context.Context, name string, m config.MCPConfig) (*client.Client, error) {
332− c, err := createMcpClient(name, m)
332+func createAndInitializeClient(ctx context.Context, name string, m config.MCPConfig, resolver config.VariableResolver) (*client.Client, error) {
333+ c, err := createMcpClient(name, m, resolver)
333334 if err != nil {
334335 updateMCPState(name, MCPStateError, err, nil, 0)
335336 slog.Error("error creating mcp client", "error", err, "name", name)
@@ -367,14 +368,18 @@ func maybeTimeoutErr(err error, timeout time.Duration) error {
367368 return err
368369}
369370
370−func createMcpClient(name string, m config.MCPConfig) (*client.Client, error) {
371+func createMcpClient(name string, m config.MCPConfig, resolver config.VariableResolver) (*client.Client, error) {
371372 switch m.Type {
372373 case config.MCPStdio:
373− if strings.TrimSpace(m.Command) == "" {
374+ command, err := resolver.ResolveValue(m.Command)
375+ if err != nil {
376+ return nil, fmt.Errorf("invalid mcp command: %w", err)
377+ }
378+ if strings.TrimSpace(command) == "" {
374379 return nil, fmt.Errorf("mcp stdio config requires a non-empty 'command' field")
375380 }
376381 return client.NewStdioMCPClientWithOptions(
377− home.Long(m.Command),
382+ home.Long(command),
378383 m.ResolvedEnv(),
379384 m.Args,
380385 transport.WithCommandLogger(mcpLogger{name: name}),