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

  1. Use the full three-segment key format: mcp_servers.<server-name>.<field>, e.g. mcp_servers.filesystem.type
  2. Ensure the server name and field segments are both non-empty
  3. Avoid extra dots in the key; extra dots land in the field segment and produce unknown-field errors downstream
  4. 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

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


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/b4f53d3612d623ea. Report an issue: GitHub.