alibaba/open-code-review · error

header name must not be empty

Error message

header name must not be empty

What it means

parseMCPHeaders validates each parsed header pair and rejects a header with an empty name using "header name must not be empty". An empty key in the JSON object cannot be sent as an HTTP header, so it is refused during config entry rather than failing later at request time.

Source

Thrown at cmd/opencodereview/config_cmd.go:943

		entry.Setup = value
	default:
		return fmt.Errorf("unknown MCP server field %q: supported fields are type, command, args, env, url, headers, tools, setup", field)
	}

	cfg.MCPServers[name] = entry
	return nil
}

// parseMCPHeaders parses a JSON object of header key-value pairs.
// Example: {"Authorization": "Bearer $TOKEN", "X-Custom": "value"}
func parseMCPHeaders(value string) (map[string]string, error) {
	var m map[string]string
	if err := json.Unmarshal([]byte(value), &m); err != nil {
		return nil, fmt.Errorf("expected JSON object: %w", err)
	}
	for k, v := range m {
		if k == "" {
			return nil, fmt.Errorf("header name must not be empty")
		}
		if v == "" {
			return nil, fmt.Errorf("header value for %q must not be empty", k)
		}
	}
	return m, nil
}

func (c *Config) ensureTelemetry() {
	if c.Telemetry == nil {
		c.Telemetry = &TelemetryConfig{}
	}
}

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Provide a non-empty key for every pair: '{"Authorization":"Bearer t"}'
  2. Check shell expansions used to build the JSON — ensure the key variable is set
  3. Edit the stored config entry directly if it was written programmatically

Example fix

// before
ocr config set mcp-servers.myserver.headers '{"": "bearer-token"}'
// after
ocr config set mcp-servers.myserver.headers '{"Authorization": "Bearer token"}'
Defensive patterns

Strategy: validation

Validate before calling

func keysNonEmpty(s string) bool {
    var m map[string]string
    if json.Unmarshal([]byte(s), &m) != nil { return false }
    for k := range m { if k == "" { return false } }
    return true
}

Type guard

func hasEmptyKey(m map[string]string) bool { _, ok := m[""]; return ok }

Try / catch

if err := setMCPServerValue(cfg, name, "headers", raw); err != nil {
    if strings.Contains(err.Error(), "header name must not be empty") { /* fix the empty key */ }
    return err
}

Prevention

When it happens

Trigger: A headers JSON object containing an empty-string key, e.g. '{"":"value"}' — typically from template interpolation that produced an empty variable name, or accidental deletion of a key in an editor.

Common situations: Unset environment variable interpolated into the key position (e.g. '{"$HDR_NAME":"v"}' with $HDR_NAME empty via naive shell expansion); copy-paste that dropped the key.

Related errors


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