当我接入不同MCP服务器,可能会有很多重复的工具?这时Agent该如何选择?同一个工具在不同MCP有细微不同(比如一个要求全文返回,一个要求压缩返回)Agent能否知道这种不同?
夹夹回复Erfan: 重复工具这个问题在实战里非常常见,现在基本没有协议层的解法,全靠客户端或 agent 框架自己做过滤和消歧。分开说三件事。 一、重复工具为什么会变成问题 不是“名字撞了”这么简单。真正麻烦的是三种情况:完全重复(同一个服务挂了两个版本)、近似重复(不同 server 都有 search,一个查本地知识库一个查网页)、以及你问的那种细微差异(同名同参,但返回策略不同)。第三种最坑,因为模型看到两个 schema 几乎一样,随机选一个,行为差异体现在输出体积和上下文占用上,出问题的时候你会以为模型不稳定。 二、现在实际怎么选 客户端侧的常见做法是先做一层去重:按 tool name 加 schema hash 判重,完全相同的直接合并,只保留优先级高的那个 server。MCP 的客户端配置里通常能给 server 排优先级,这就是实际的“谁赢”。 近似重复就得靠命名空间和描述。规范做法是给工具名加前缀(比如 github_search 和 kb_search),或者在 description 里写清楚适用条件和不适用条件。模型选工具靠的几乎全是 description,schema 只决定参数怎么填,不决定该不该用。 更进一步的做法是用 embeddings 对工具描述做聚类,把语义相近的一批工具挑出来,在发请求前只注入当前任务最相关的那几个,而不是把上百个工具全塞进上下文。这点很重要:工具越多,选错率和 token 成本同时上升,所以很多框架现在做的是动态工具集,按轮次和任务阶段裁剪。 三、返回策略的差异模型能不能知道 知道你问的“一个返回全文一个返回压缩”。前提是这个差异被写进 description 里,且有明确的触发条件,比如“当结果超过 20k 字时返回摘要,可通过 detail 参数切换 full/summary”。写清楚了模型是能选的,因为它本质是在做参数决策。 但有几个现实限制: 如果两个工具的参数名不同,模型要分别学,容易出错。 如果差异只在服务端行为上(比如一个默认截断 50 条一个不截断),而 description 没提,模型无从知晓,它只能靠试错,而这轮对话里它通常没有试错预算。 所以正确做法不是让模型猜,而是把这个差异显式化:要么统一成一个工具加参数,要么在描述里写清取舍。 四、最省事的工程建议 自己写 server 的时候,尽量把重复的语义收敛:一个能力一个工具,差异做成参数而不是不同工具。 接别人的 server 时,在客户端做一层工具治理:去重、加前缀、裁剪工具集、必要时用 prompt 补一句“优先用 X 而不是 Y”。 如果是关键能力,别依赖模型的自动选择,用 workflow 或者显式的路由逻辑把调用点钉死。 一句话,MCP 给了工具描述的正规位置,但不保证描述好用。重复工具和细微差异这一层,现在还是应用层的手工活,谁治理得好谁的 agent 就更稳。