alibaba/open-code-review · error
invalid MCP server key %q: expected mcp_servers.<name>.<fiel
Error message
invalid MCP server key %q: expected mcp_servers.<name>.<field>
What it means
setMCPServerValue validates the dotted key used by `ocr config set` for MCP server entries. The key must have exactly three non-empty segments: mcp_servers.<name>.<field>. This error is returned when the key splits into fewer or more segments or has an empty name/field segment.
Source
Thrown at cmd/opencodereview/config_cmd.go:847
if _, exists := cfg.CustomProviders[name]; isAuxiliaryProviderField(field) && !exists {
providerKey := strings.TrimSuffix(key, "."+field)
return fmt.Errorf("provider %q is not configured; set a core field first (protocol is required for every custom provider):\n ocr config set %s.protocol <protocol>", name, providerKey)
}
if cfg.CustomProviders == nil {
cfg.CustomProviders = make(map[string]ProviderEntry)
}
entry := cfg.CustomProviders[name]
if err := applyProviderField(name, &entry, field, key, value); err != nil {
return err
}
cfg.CustomProviders[name] = entry
return nil
}
func setMCPServerValue(cfg *Config, key, value string) error {
parts := strings.SplitN(key, ".", 3)
if len(parts) != 3 || parts[1] == "" || parts[2] == "" {
return fmt.Errorf("invalid MCP server key %q: expected mcp_servers.<name>.<field>", key)
}
name, field := parts[1], parts[2]
if cfg.MCPServers == nil {
cfg.MCPServers = make(map[string]MCPServerConfig)
}
entry := cfg.MCPServers[name]
switch field {
case "type":
if value != "stdio" && value != "remote" {
return fmt.Errorf("invalid MCP server type %q: must be \"stdio\" or \"remote\"", value)
}
entry.Type = value
case "command":
if value == "" {
return fmt.Errorf("MCP server command cannot be empty")
}View on GitHub (pinned to 5cf97d0d15)
Solutions
- Use the full three-segment key format: mcp_servers.<server-name>.<field>, e.g. mcp_servers.filesystem.type
- Ensure the server name and field segments are both non-empty
- Avoid extra dots in the key; extra dots land in the field segment and produce unknown-field errors downstream
- Run `ocr config --help` to see the accepted key formats
Example fix
// before ocr config set mcp_servers.myserver // after ocr config set mcp_servers.myserver.type stdio
Defensive patterns
Strategy: validation
Validate before calling
parts := strings.Split(key, ".")
if len(parts) != 3 || parts[1] == "" || parts[2] == "" {
return fmt.Errorf("key must be mcp_servers.<name>.<field>, got %q", key)
} Type guard
func isValidMCPServerKey(key string) bool {
parts := strings.Split(key, ".")
return len(parts) == 3 && parts[1] != "" && parts[2] != ""
} Try / catch
if err := setMCPServerValue(cfg, key, value); err != nil {
fmt.Fprintf(os.Stderr, "config set failed: %v\n", err)
os.Exit(1)
} Prevention
- Always pass the full three-segment key: mcp_servers.<name>.<field>
- Quote keys containing dots for your shell
- Check `ocr config --help` for the key grammar before scripting
When it happens
Trigger: Calling setMCPServerValue (via `ocr config set`) with a key like "mcp_servers" (1 part), "mcp_servers.myserver" (2 parts), "mcp_servers..command" (empty name), "mcp_servers.myserver." (empty field), or a key with more than 3 dot-separated parts since SplitN with limit 3 leaves extra dots in the field segment.
Common situations: Typos in the config key, forgetting the field segment (e.g. `ocr config set mcp_servers.myserver` without a field), accidentally including extra dots, or pasting a key from docs for a different config section.
Related errors
- invalid MCP server type %q: must be "stdio" or "remote"
- MCP server command cannot be empty
- invalid JSON array for %s: %w
- invalid env entry %q: must be in KEY=VALUE format
- MCP server URL cannot be empty
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/b4f53d3612d623ea.
Report an issue: GitHub.