在使用ai查询数据时,发现返回到的数据有时候会存在错误,于是记录下追踪该问题产生的原因以及解决方法

这是一个查询指定时间范围订单数的MCP
简化MCP如下:
注册工具代码:

@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="query_order_num",
            description="查询指定时间范围内的订单数",
            inputSchema={
                "type": "object",
                "properties": {
                    "start_date": {
                        "type": "string",
                        "description": "开始日期,可以是YYYY-MM-DD、YYYY-MM-DD HH:mm:ss",
                    },
                    "end_date": {
                        "type": "string",
                        "description": "结束日期,可以是YYYY-MM-DD、YYYY-MM-DD HH:mm:ss",
                    },
                },
                "required": ["start_date", "end_date"],
            },
        )
    ]

工具调用代码:

if len(start_time) == 10:
            start_time += " 00:00:00"
        if len(end_time) == 10:
            end_time += " 00:00:00"

8月14日实际有12个订单
假如你问大模型,大模型有概率返回为0个订单

为什么会这样呢?

我们仔细看mcp里的描述以及传参,这是有陷阱的设计,即后端接口实际接受的格式为 YYYY-MM-DD HH:mm:ss
而mcp里允许传入参数到Day,代码自动加上00:00:00补齐。再传给后端。
有些AI则直接传递 2026-08-14 到 2026-08-14,导致取回的订单数为0

21932-07yarobhl5i4.png

你换个说法,或者多查询几次,AI则可能会传递 2026-08-14 00:00:00 到 2026-08-14 23:59:59
查出正确的订单数

21846-2ft6ps8i0hp.png

其问题出在MCP的设计,描述不够清晰,而且主动纠正参数,这部分最好是以描述形式,详细告诉AI。
调用的工具尽可能不要自行处理参数,把参数控制在是工具定义上

@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="query_order_num",
            description="查询指定时间范围内的订单数",
            inputSchema={
                "type": "object",
                "properties": {
                    "start_date": {
                        "type": "string",
                        "description": "开始日期,格式:YYYY-MM-DD HH:mm:ss,例如:2026-08-14 00:00:00",
                    },
                    "end_date": {
                        "type": "string",
                        "description": "结束日期,格式:YYYY-MM-DD HH:mm:ss,例如:2026-08-14 23:59:59",
                    },
                },
                "required": ["start_date", "end_date"],
            },
        )
    ]