jaegertracing/jaeger · error
invalid end_time: %w
Error message
invalid end_time: %w
What it means
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.
Source
Thrown at cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go:47
// NewGetDependenciesHandler creates a new get_service_dependencies handler.
func NewGetDependenciesHandler(
queryService *querysvc.QueryService,
) mcp.ToolHandlerFor[types.GetDependenciesInput, types.GetDependenciesOutput] {
h := &getDependenciesHandler{
queryService: queryService,
}
return h.handle
}
func (h *getDependenciesHandler) handle(
ctx context.Context,
_ *mcp.CallToolRequest,
input types.GetDependenciesInput,
) (*mcp.CallToolResult, types.GetDependenciesOutput, error) {
endTime, err := parseDependencyTime(input.EndTime, time.Now())
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid end_time: %w", err)
}
defaultStart := endTime.Add(-24 * time.Hour)
startTime, err := parseDependencyTime(input.StartTime, defaultStart)
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid start_time: %w", err)
}
if !startTime.Before(endTime) {
return nil, types.GetDependenciesOutput{}, errors.New("start_time must be before end_time")
}
lookback := endTime.Sub(startTime)
deps, err := h.queryService.GetDependencies(ctx, endTime, lookback)
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("failed to get dependencies: %w", err)
}
View on GitHub (pinned to 806f444784)
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.
Example fix
// before
{"tool":"get_dependencies","args":{"end_time":"now-1h"}}
// after
{"tool":"get_dependencies","args":{"end_time":"2026-08-31T09:00:00Z"}} Defensive patterns
Strategy: validation
Validate before calling
func validEndTime(s string) bool {
if s == "" { return true } // defaults to time.Now()
_, err := time.Parse(time.RFC3339, s)
return err == nil
} Type guard
func isRFC3339(s string) bool {
_, err := time.Parse(time.RFC3339, s)
return err == nil
} Try / catch
out, _, err := handler.Handle(ctx, req, input)
if err != nil && strings.HasPrefix(err.Error(), "invalid end_time") {
input.EndTime = time.Now().UTC().Format(time.RFC3339)
out, _, err = handler.Handle(ctx, req, input)
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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".
Related errors
- invalid start_time: %w
- trace_id is required
- start_time must be before end_time
- trace_id is required
- span_ids is required and must not be empty
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/753545ed9b09d40a.
Report an issue: GitHub.