{"record":{"id":"08a80550af44aa50","repo":"googleapis/mcp-toolbox","slug":"toolbox-binary-not-found","errorCode":null,"errorMessage":"Toolbox binary not found","messagePattern":"Toolbox binary not found","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cmd/internal/skills/generator.go","lineNumber":213,"sourceCode":"\t\tconst npxArgs = [\"--yes\", \"@toolbox-sdk/server@{{.ToolboxVersion}}\", \"--log-level\", \"error\", ...configArgs, \"invoke\", toolName, \"--user-agent-metadata\", userAgent, ...processedArgs];\n\n\t\tconst child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env });\n\t\t{{else}}\n\t\tfunction getToolboxPath() {\n\t\t\t\tif (process.env.GEMINI_CLI === '1') {\n\t\t\t\t\t\tconst ext = process.platform === 'win32' ? '.exe' : '';\n\t\t\t\t\t\tconst localPath = path.resolve(__dirname, '../../../toolbox' + ext);\n\t\t\t\t\t\tif (fs.existsSync(localPath)) {\n\t\t\t\t\t\t\t\treturn localPath;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\t\tconst checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox';\n\t\t\t\t\t\tconst globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim();\n\t\t\t\t\t\tif (globalPath) {\n\t\t\t\t\t\t\t\treturn globalPath.split('\\n')[0].trim();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(\"Toolbox binary not found\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthrow new Error(\"Toolbox binary not found\");\n\t\t\t\t}\n\t\t}\n\n\t\tlet toolboxBinary;\n\t\ttry {\n\t\t\t\ttoolboxBinary = getToolboxPath();\n\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Error:\", err.message);\n\t\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst toolboxArgs = [\"--log-level\", \"error\", ...configArgs, \"invoke\", toolName, \"--user-agent-metadata\", userAgent, ...args];\n\t\tconst child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env });\n\t\t{{end}}\n\n    child.on('close', (code) => {","sourceCodeStart":195,"sourceCodeEnd":231,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/cmd/internal/skills/generator.go#L195-L231","documentation":"JSONToFirestoreValue parses a Firestore typed value with type \"timestampValue\" and requires an RFC3339Nano-formatted string. time.Parse failed, so the input string is not a valid RFC 3339 timestamp. The original parse error is wrapped with %w so you can inspect it via errors.Unwrap/As.","triggerScenarios":"Passing {\"timestampValue\": \"<string>\"} into JSONToFirestoreValue where the string is not parseable by time.RFC3339Nano (e.g. \"2024-01-01\", epoch millis, \"2024-01-01T00:00:00\" missing timezone, or trailing garbage).","commonSituations":"Clients send dates produced by JavaScript Date.toLocaleString or date-only inputs from HTML date pickers; timestamps serialized without the UTC 'Z' suffix; unix epoch numbers stringified into the timestamp field.","solutions":["Reformat the string to a full RFC 3339 timestamp with timezone and fractional seconds, e.g. \"2024-01-01T12:00:00.000Z\".","If the input is an epoch number, convert it in Go with time.Unix(...).Format(time.RFC3339Nano) before passing it in.","Inspect the wrapped error with errors.As(err, &parseErr) to see the exact parse failure position."],"exampleFix":"// before\nv := map[string]any{\"timestampValue\": \"2024-01-01 12:00:00\"}\n// after\nv := map[string]any{\"timestampValue\": \"2024-01-01T12:00:00Z\"}","handlingStrategy":"validation","validationCode":"func isValidRFC3339(s string) bool { _, err := time.Parse(time.RFC3339Nano, s); return err == nil }","typeGuard":"func asTimestampString(v any) (string, bool) { s, ok := v.(string); return s, ok && isValidRFC3339(s) }","tryCatchPattern":"var v any = ... // converted value\nif _, err := JSONToFirestoreValue(map[string]any{\"timestampValue\": s}, client); err != nil {\n    var pe *time.ParseError\n    if errors.As(err, &pe) { /* fix format */ }\n}","preventionTips":["Always serialize timestamps with time.Format(time.RFC3339Nano) or JSON default time.Time marshaling","Never emit epoch numbers where an RFC 3339 string is expected","Unit-test payloads containing timestamps before submission"],"tags":["firestore","timestamp","parsing"],"backgroundTag":"invalid-timestamp-format","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}