{"record":{"id":"6470484cb3a89e77","repo":"sansan0/TrendRadar","slug":"date-range-start-end","errorCode":null,"errorMessage":"date_range 必须包含 start 和 end 字段","messagePattern":"date_range 必须包含 start 和 end 字段","errorType":"validation","errorClass":"InvalidParameterError","httpStatus":null,"severity":"error","filePath":"mcp_server/utils/validators.py","lineNumber":438,"sourceCode":"            except InvalidParameterError:\n                raise\n            except Exception:\n                raise InvalidParameterError(\n                    f\"日期解析失败: {stripped}\",\n                    suggestion=\"支持格式: YYYY-MM-DD, {\\\"start\\\": \\\"...\\\", \\\"end\\\": \\\"...\\\"}, 或自然语言（今天、本周、最近7天等）\"\n                )\n\n    if not isinstance(date_range, dict):\n        raise InvalidParameterError(\n            \"date_range 必须是字典类型、日期字符串或有效的JSON字符串\",\n            suggestion='例如: {\"start\": \"2025-10-01\", \"end\": \"2025-10-11\"} 或 \"2025-10-01\"'\n        )\n\n    start_str = date_range.get(\"start\")\n    end_str = date_range.get(\"end\")\n\n    if not start_str or not end_str:\n        raise InvalidParameterError(\n            \"date_range 必须包含 start 和 end 字段\",\n            suggestion='例如: {\"start\": \"2025-10-01\", \"end\": \"2025-10-11\"}'\n        )\n\n    start_date = validate_date(start_str)\n    end_date = validate_date(end_str)\n\n    if start_date > end_date:\n        raise InvalidParameterError(\n            \"开始日期不能晚于结束日期\",\n            suggestion=f\"start: {start_str}, end: {end_str}\"\n        )\n\n    # 检查日期是否在未来\n    today = datetime.now().date()\n    if start_date.date() > today or end_date.date() > today:\n        # 获取可用日期范围提示\n        try:","sourceCodeStart":420,"sourceCodeEnd":456,"githubUrl":"https://github.com/sansan0/TrendRadar/blob/8ee26026ba6c11dec41a95fb3895a7162876caa1/mcp_server/utils/validators.py#L420-L456","documentation":"Raised when date_range is a dict but either 'start' or 'end' is missing or falsy (empty string/None). Both keys are mandatory — a single-sided range like {\"start\": \"2025-10-01\"} is rejected rather than defaulted. Extra keys are ignored; only presence of the two matters.","triggerScenarios":"Sending {\"start\": \"2025-10-01\"} only, {\"end\": \"2025-10-11\"} only, {\"from\": ..., \"to\": ...} (wrong key names), or {\"start\": \"\", \"end\": \"\"}. Also LLMs using key names like startDate/endDate.","commonSituations":"Clients porting from APIs that accept open-ended ranges; key-name mismatches (from/to vs start/end); forms where one bound is optional; typos in keys ('Start', 'starts').","solutions":["Always include both keys: {\"start\": \"2025-10-01\", \"end\": \"2025-10-11\"}","Use exactly 'start' and 'end' (lowercase) — not from/to, startDate/endDate","For an open-ended need, bound it explicitly (e.g. end = today)","Build the dict programmatically and assert both keys before sending"],"exampleFix":"// before\n{\"date_range\": {\"from\": \"2025-10-01\", \"to\": \"2025-10-11\"}}\n// after\n{\"date_range\": {\"start\": \"2025-10-01\", \"end\": \"2025-10-11\"}}","handlingStrategy":"validation","validationCode":"if (!dr?.start || !dr?.end) {\n  dr = { start: dr?.start || isoDaysAgo(7), end: dr?.end || isoToday() };\n}","typeGuard":"const hasStartAndEnd = (v: unknown): v is { start: string; end: string } =>\n  typeof v === 'object' && v !== null &&\n  typeof (v as any).start === 'string' && typeof (v as any).end === 'string' &&\n  (v as any).start !== '' && (v as any).end !== '';","tryCatchPattern":"try { call({ date_range: dr }); }\ncatch (e) {\n  if (/必须包含 start 和 end/.test(e.message)) call({ date_range: { start: dr.start || isoDaysAgo(7), end: dr.end || isoToday() } });\n  else throw e;\n}","preventionTips":["Use exactly the keys start and end, lowercase","Assert both keys non-empty before sending","Fill open-ended bounds with today or a known earliest date"],"tags":["date-range","required-fields","validation"],"backgroundTag":null,"analyzedSha":"8ee26026ba6c11dec41a95fb3895a7162876caa1","analyzedAt":"2026-08-15T01:42:18.084Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}