{"record":{"id":"b5b29d742ea5d897","repo":"sansan0/TrendRadar","slug":"param-name-value","errorCode":null,"errorMessage":"{param_name} 必须是整数，无法解析: {value}","messagePattern":"(.+?) 必须是整数，无法解析: (.+?)","errorType":"validation","errorClass":"InvalidParameterError","httpStatus":null,"severity":"error","filePath":"mcp_server/utils/validators.py","lineNumber":99,"sourceCode":"    Returns:\n        解析后的整数\n\n    Raises:\n        InvalidParameterError: 解析失败\n    \"\"\"\n    value = value.strip()\n\n    try:\n        # 尝试直接转换\n        return int(value)\n    except ValueError:\n        pass\n\n    # 尝试解析浮点数后取整\n    try:\n        return int(float(value))\n    except ValueError:\n        raise InvalidParameterError(\n            f\"{param_name} 必须是整数，无法解析: {value}\",\n            suggestion=f\"请提供有效的整数值，如: 10, 50, 100\"\n        )\n\n\ndef _parse_string_to_float(value: str, param_name: str = \"参数\") -> float:\n    \"\"\"\n    将字符串解析为浮点数\n\n    Args:\n        value: 字符串值\n        param_name: 参数名（用于错误消息）\n\n    Returns:\n        解析后的浮点数\n\n    Raises:\n        InvalidParameterError: 解析失败","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/sansan0/TrendRadar/blob/8ee26026ba6c11dec41a95fb3895a7162876caa1/mcp_server/utils/validators.py#L81-L117","documentation":"Raised by _parse_string_to_int in validators.py when a string parameter cannot be coerced to int. The helper first tries int(value), then int(float(value)) so '3.5' becomes 3; only if both fail does it raise. param_name is interpolated so the message names the offending parameter (commonly 'limit' or 'top_n').","triggerScenarios":"Passing limit/top_n as a string like \"abc\", \"10x\", \"1e\", \"\", or \"null\". Typically happens when an MCP client serializes numbers as strings and the user supplied a non-numeric value, e.g. tools/call with {\"limit\": \"many\"}.","commonSituations":"HTTP-based MCP clients that stringify all arguments; LLMs hallucinating word-based numbers ('twenty'); empty-string defaults from form inputs; locale decimal separators like '1,5' or '1.000,5'.","solutions":["Provide a clean numeric string or an actual integer: 10, \"10\", or \"10.0\"","Strip whitespace and thousands separators before sending: value.replace(',', '') if the comma is a grouping separator","If the value can be empty, send null/omit the parameter instead of an empty string so the validator applies its default","Catch InvalidParameterError client-side and re-prompt with the suggestion (valid integers like 10, 50, 100)"],"exampleFix":"// before\n{\"limit\": \"10 items\"}\n// after\n{\"limit\": 10}","handlingStrategy":"validation","validationCode":"function toInt(v: unknown, name = 'limit'): number {\n  const n = Number(String(v).trim());\n  if (!Number.isFinite(n)) throw new Error(`${name} must be numeric`);\n  return Math.trunc(n);\n}\nconst limit = toInt(rawLimit); // call tool with this","typeGuard":"const isIntLike = (v: unknown): v is number => {\n  if (typeof v === 'number') return Number.isInteger(v);\n  return /^-?\\d+(\\.\\d+)?$/.test(String(v).trim());\n};","tryCatchPattern":"try { call({ limit }); }\ncatch (e) {\n  if (e.name === 'InvalidParameterError' && /整数/.test(e.message)) {\n    call({ limit: 20 }); // retry with default\n  } else throw e;\n}","preventionTips":["Send native JSON numbers, never formatted strings","Strip whitespace/units/commas from numeric strings before sending","Treat empty numeric fields as omitted, not empty strings"],"tags":["type-coercion","validation","string-parsing"],"backgroundTag":null,"analyzedSha":"8ee26026ba6c11dec41a95fb3895a7162876caa1","analyzedAt":"2026-08-15T01:42:18.084Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}