sipeed/picoclaw · error
MCP server '%s' is not configured
Error message
MCP server '%s' is not configured
What it means
ListMCPTools did a case-insensitive scan of cfg.Tools.MCP.Servers and found no key matching the requested server name. The name is not defined in configuration at all, so no tools can be listed. The check is EqualFold, so casing is not the problem — the entry is missing.
Source
Thrown at pkg/agent/agent_command.go:201
return nil, fmt.Errorf("command unavailable: config not loaded")
}
serverName = strings.TrimSpace(serverName)
if serverName == "" {
return nil, fmt.Errorf("server name is required")
}
resolvedName := ""
var serverCfg config.MCPServerConfig
for name, candidate := range cfg.Tools.MCP.Servers {
if strings.EqualFold(name, serverName) {
resolvedName = name
serverCfg = candidate
break
}
}
if resolvedName == "" {
return nil, fmt.Errorf("MCP server '%s' is not configured", serverName)
}
if !serverCfg.Enabled {
return nil, fmt.Errorf("MCP server '%s' is configured but disabled", resolvedName)
}
if !cfg.Tools.IsToolEnabled("mcp") {
return nil, fmt.Errorf("MCP integration is disabled")
}
if err := al.ensureMCPInitialized(ctx); err != nil {
logger.WarnCF("agent", "Failed to initialize MCP runtime for command",
map[string]any{
"server": resolvedName,
"error": err.Error(),
})
}
manager := al.mcp.getManager()
if manager == nil {View on GitHub (pinned to 49183d7e8d)
Solutions
- Run /mcp list (ListMCPServers) to see exact configured names, then retry with one of them
- Add the missing server under tools.mcp.servers in the active config file and reload
- Verify which config file is active (workspace vs global) if you edited one and the server is still reported missing
Example fix
# before /mcp tools clawhubb # typo # after /mcp list # confirm exact name /mcp tools clawhub
Defensive patterns
Strategy: validation
Validate before calling
func serverConfigured(cfg *config.Config, name string) bool {
for n := range cfg.Tools.MCP.Servers {
if strings.EqualFold(n, name) { return true }
}
return false
} Type guard
func isConfiguredServer(cfg *config.Config, name string) (string, bool) {
for n := range cfg.Tools.MCP.Servers {
if strings.EqualFold(n, name) { return n, true }
}
return "", false
} Prevention
- Populate server pickers from cfg.Tools.MCP.Servers keys, not free text
- Validate server names against config before invoking tool listing
- Keep server names stable across config layers
When it happens
Trigger: Calling the tool-list command with a server name absent from the `tools.mcp.servers` map in the picoclaw config: typo, referencing a server defined in a different config file, or expecting a server that was never added.
Common situations: Server was renamed or removed from config; user copies a server name from docs/another project; config file being edited points elsewhere (workspace vs user config precedence); server registered programmatically only in another process.
Related errors
- MCP server %q not found
- MCP server %q not found
- MCP server %q not found
- command unavailable: config not loaded
- MCP server '%s' is configured but disabled
AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15).
Data as JSON: /api/errors/c5ea6eb41708a48c.
Report an issue: GitHub.