{"record":{"id":"753545ed9b09d40a","repo":"jaegertracing/jaeger","slug":"invalid-end-time-w","errorCode":null,"errorMessage":"invalid end_time: %w","messagePattern":"invalid end_time: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go","lineNumber":47,"sourceCode":"\n// NewGetDependenciesHandler creates a new get_service_dependencies handler.\nfunc NewGetDependenciesHandler(\n\tqueryService *querysvc.QueryService,\n) mcp.ToolHandlerFor[types.GetDependenciesInput, types.GetDependenciesOutput] {\n\th := &getDependenciesHandler{\n\t\tqueryService: queryService,\n\t}\n\treturn h.handle\n}\n\nfunc (h *getDependenciesHandler) handle(\n\tctx context.Context,\n\t_ *mcp.CallToolRequest,\n\tinput types.GetDependenciesInput,\n) (*mcp.CallToolResult, types.GetDependenciesOutput, error) {\n\tendTime, err := parseDependencyTime(input.EndTime, time.Now())\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"invalid end_time: %w\", err)\n\t}\n\n\tdefaultStart := endTime.Add(-24 * time.Hour)\n\tstartTime, err := parseDependencyTime(input.StartTime, defaultStart)\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"invalid start_time: %w\", err)\n\t}\n\n\tif !startTime.Before(endTime) {\n\t\treturn nil, types.GetDependenciesOutput{}, errors.New(\"start_time must be before end_time\")\n\t}\n\n\tlookback := endTime.Sub(startTime)\n\tdeps, err := h.queryService.GetDependencies(ctx, endTime, lookback)\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"failed to get dependencies: %w\", err)\n\t}\n","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go#L29-L65","documentation":"The Jaeger MCP get_dependencies tool handler parses the optional end_time field of GetDependenciesInput using parseDependencyTime (falling back to time.Now() when empty). If the provided value is present but cannot be parsed as a valid timestamp, the handler wraps the underlying parse error with \"invalid end_time\" so the MCP caller knows which field was bad. It is a request-validation error, not a storage failure.","triggerScenarios":"Calling the get_dependencies MCP tool with input.EndTime set to a non-timestamp string (e.g. \"now\", \"2024-13-45\", \"yesterday\"), or a format parseDependencyTime does not accept, such as a bare date without time or an RFC3339 string with the wrong timezone syntax.","commonSituations":"LLM clients or scripts filling EndTime with human-friendly phrases instead of RFC3339 timestamps; copy-pasted timestamps with missing 'T' or 'Z'; locale-formatted dates from spreadsheets or UIs; time in local format like \"08/31/2026 10:00\".","solutions":["Pass end_time as an RFC3339/UTC timestamp, e.g. \"2026-08-31T10:00:00Z\".","Omit end_time entirely to let the handler default to time.Now().","Validate/format the timestamp client-side before calling the tool.","Read the wrapped %w error to see exactly which parse step failed."],"exampleFix":"// before\n{\"tool\":\"get_dependencies\",\"args\":{\"end_time\":\"now-1h\"}}\n// after\n{\"tool\":\"get_dependencies\",\"args\":{\"end_time\":\"2026-08-31T09:00:00Z\"}}","handlingStrategy":"validation","validationCode":"func validEndTime(s string) bool {\n\tif s == \"\" { return true } // defaults to time.Now()\n\t_, err := time.Parse(time.RFC3339, s)\n\treturn err == nil\n}","typeGuard":"func isRFC3339(s string) bool {\n\t_, err := time.Parse(time.RFC3339, s)\n\treturn err == nil\n}","tryCatchPattern":"out, _, err := handler.Handle(ctx, req, input)\nif err != nil && strings.HasPrefix(err.Error(), \"invalid end_time\") {\n\tinput.EndTime = time.Now().UTC().Format(time.RFC3339)\n\tout, _, err = handler.Handle(ctx, req, input)\n}","preventionTips":["Always generate timestamps with time.Now().UTC().Format(time.RFC3339).","Omit end_time when you mean 'now'.","Never pass human phrases like 'now-1h' or 'yesterday'.","Validate timestamps client-side before invoking the MCP tool."],"tags":["mcp","validation","timestamp","jaeger"],"backgroundTag":"invalid-timestamp-format","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}