{"record":{"id":"8a50559c33b47f38","repo":"sipeed/picoclaw","slug":"invalid-env-assignment-q-expected-key-value","errorCode":null,"errorMessage":"invalid env assignment %q: expected KEY=value","messagePattern":"invalid env assignment %q: expected KEY=value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/picoclaw/internal/mcp/helpers.go","lineNumber":222,"sourceCode":"func sortedServerNames(servers map[string]config.MCPServerConfig) []string {\n\tnames := make([]string, 0, len(servers))\n\tfor name := range servers {\n\t\tnames = append(names, name)\n\t}\n\tsort.Strings(names)\n\treturn names\n}\n\nfunc parseEnvAssignments(values []string) (map[string]string, error) {\n\tif len(values) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tenv := make(map[string]string, len(values))\n\tfor _, entry := range values {\n\t\tkey, value, found := strings.Cut(entry, \"=\")\n\t\tif !found {\n\t\t\treturn nil, fmt.Errorf(\"invalid env assignment %q: expected KEY=value\", entry)\n\t\t}\n\t\tkey = strings.TrimSpace(key)\n\t\tif key == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"invalid env assignment %q: key cannot be empty\", entry)\n\t\t}\n\t\tenv[key] = value\n\t}\n\n\treturn env, nil\n}\n\nfunc parseHeaderAssignments(values []string) (map[string]string, error) {\n\tif len(values) == 0 {\n\t\treturn nil, nil\n\t}\n\n\theaders := make(map[string]string, len(values))\n\tfor _, entry := range values {","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/sipeed/picoclaw/blob/49183d7e8daed0dba89ddbb6fcb60089401d9680/cmd/picoclaw/internal/mcp/helpers.go#L204-L240","documentation":"parseEnvAssignments (helpers.go:213-232) requires every -e/--env value to contain '='; strings.Cut without a separator yields this error. The value side may be empty (KEY= is legal), but the separator itself is mandatory.","triggerScenarios":"`picoclaw mcp add s ./server -e API_KEY` (forgot =value); quoting that strips the pair, e.g. -e \"$VAR\" where VAR is unset so the argument becomes a bare word.","commonSituations":"Intending to forward a variable that holds its own value; muscle memory from `docker run -e VAR` which accepts bare names (this CLI does not).","solutions":["Pass explicit KEY=value form: -e API_KEY=secret","Expand the pair yourself: -e \"API_KEY=$API_KEY\"","For secrets prefer --env-file (the flag help recommends it) so values stay out of shell history"],"exampleFix":"# before\npicoclaw mcp add s ./server -e API_KEY\n# after\npicoclaw mcp add s ./server -e \"API_KEY=$API_KEY\"","handlingStrategy":"validation","validationCode":"for pair in \"${ENVS[@]}\"; do\n  case \"$pair\" in\n    *=*) ;;\n    *) echo \"invalid env assignment '$pair': expected KEY=value\" >&2; exit 2 ;;\n  esac\ndone\npicoclaw mcp add \"$name\" \"$target\" \"${ENVS[@]/#/-e }\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write -e KEY=value; this CLI does not accept bare names like docker does","Expand inline: -e \"KEY=$KEY\" instead of -e \"$KEY\""],"tags":["cli","flags","environment","validation"],"backgroundTag":null,"analyzedSha":"49183d7e8daed0dba89ddbb6fcb60089401d9680","analyzedAt":"2026-08-15T21:55:41.315Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}