MCP Client实战翻车记:两个Server同时跑,AI调错了Tool
前面写完 MCP Server 那篇文章之后我又接了个需求让一个 Agent 同时调两个 MCP Server。一个查 SQLite 数据库一个查本地文件系统。Agent 跑了一轮返回了一个答案。我看着答案觉得不太对对了一下原始数据——AI 给出了文件系统里的张三但用户问的是数据库里张三的订单记录。不是 Server 写错了不是模型不行。是 AI 调错了 Tool。两个 Server 都有 search 方法AI 选了文件系统的 search但它应该调数据库的 query。这时候我才真正理解 MCP Client 是干什么用的——它不是简单的连接器而是一个翻译官把多组 Server 的能力转译成 AI 能正确理解的语言。Client 到底是干什么的先花最短的时间说清楚角色分工。MCP ServerMCP Client职责提供 Tool 给外部调用把 Tool 翻译给 AI 理解类比一个 API 接口API 文档 调用说明书出问题的地方Tool 内部逻辑出错AI 选错了 Tool / 参数传不对管理粒度每个 Server 独立运行一个 Client 可对接多个 ServerServer 只负责我有这个能力Client 负责AI 怎么知道该用哪个。这个区分听起来简单但只有当你手上有两个以上 Server 的时候才知道 Client 的设计直接决定了 AI 会不会乱来。翻车现场还原先说场景。我在本地分别启动了 Node.js 写的两个 Server一个暴露了 search、query、insert 三个 Tool 来操作 SQLite另一个暴露了 search、read、write 来做文件读写。然后写了一个 Client 把它们连起来。以下代码基于modelcontextprotocol/sdk0.6.x 版本。第一版 Client 长这样import{Client}frommodelcontextprotocol/sdk/client/index.js;import{StdioClientTransport}frommodelcontextprotocol/sdk/client/stdio.js;constdbClientnewClient({name:database-client});constfileClientnewClient({name:filesystem-client});awaitdbClient.connect(newStdioClientTransport({command:node,args:[db-server.mjs]}));awaitfileClient.connect(newStdioClientTransport({command:node,args:[file-server.mjs]}));// 列出各 Server 的 ToolconstdbToolsawaitdbClient.listTools();constfileToolsawaitfileClient.listTools();代码看起来没毛病对吧两个 Client 实例分别连接不同的 Server各管各的。但是问题出在 AI 这一侧——当我把两个 Server 的 Tool 列表合并给 LLM 时AI 看到的工具列表是这样的可用工具 - search来自 database-server - query来自 database-server - insert来自 database-server - search来自 filesystem-server - read来自 filesystem-server - write来自 filesystem-server两个 search。同名。LLM 选 search 的时候你不能保证它一定选数据库的那个。事实上我跑了三组对话测试其中有两次 AI 选了文件系统的 search。“张三这个关键词在文件里确实有——某个文档里提到了这个名字——但用户问的是张三的订单”应该在数据库里查 order 表。AI 拿到文件名和对应的内容片段以为那就是答案。这个场景其实挺典型。MCP 协议本身不限制 Tool 命名唯一性Server 开发者各自命名自己的 Tool撞名是常态。问题是LLM 在做 Tool 选择时依赖的是 Tool name description 的语义匹配。当两个 Tool 的名字一模一样description 又都跟搜索相关模型大概率猜错。翻车之后怎么修发现问题后第一个想法是给 Tool 名字加上命名空间前缀。classNamespaceClient{constructor(namespace,client){this.namespacenamespace;this.clientclient;}asynclistTools(){consttoolsawaitthis.client.listTools();returntools.map(tool({...tool,name:${this.namespace}_${tool.name},description:[${this.namespace}]${tool.description}}));}asynccallTool(name,args){constoriginalNamename.replace(${this.namespace}_,);returnthis.client.callTool(originalName,args);}}constdbClientnewNamespaceClient(db,originalDbClient);constfileClientnewNamespaceClient(fs,originalFileClient);// 现在 AI 看到的列表变成了// - db_search// - db_query// - db_insert// - fs_search// - fs_read// - fs_write加上前缀之后AI 看到的就是 db_search 和 fs_search名字不同选错的概率降了很多。我跑了七八轮测试没有再出现调错 Tool 的情况。不过这里有个细节值得说——description 也要改。光是改名字不够因为 LLM 选 Tool 时 description 权重很高。我在 description 前面加了[db]和[fs]标签相当于给 AI 一个视觉锚点。后面我翻过一些文章有人用 XML 标签、有人用 Emoji我试了一圈觉得纯文本前缀最稳定模型解析出错率最低。翻车二一个 Server 挂了全链路卡死修完命名冲突之后我以为这件事搞定了。直到第二个问题冒出来。数据库 Server 那边有一次查询跑了很久——那张表数据量到了一定规模索引没有建好一次模糊查询拖了近两分钟。Client 一直在等 db_server 返回file_server 的服务也跟着没法继续。我查了一下日志才发现问题Client 是串行处理 Tool 调用的。一个 Server 的 Tool 没返回后续的调用全部排队等着。这是一个设计上的取舍。MCP Client 默认不隔离不同 Server 的超时行为一个慢 Server 会拖慢整个链路。不是每次都会遇到但遇到就卡死整条链路。修复方式很直接——给每个 Server 配独立超时import{Client}frommodelcontextprotocol/sdk/client/index.js;constdbClientnewClient({name:database-client},{transportTimeout:8000}// 8秒超时);constfileClientnewClient({name:filesystem-client},{transportTimeout:3000}// 文件操作一般快得多);配了超时之后db_server 那次慢查询在 8 秒后被 Client 主动中断file_server 的调用正常执行。当然超时本身不是完美的方案——超时意味着那个 Tool 调用失败了AI 需要重试或者走 fallback。但至少不会让其他 Server 跟着陪葬。后来我又加了一层更细的隔离给每个 Server 的 Tool 调用包了一层 try/catch让一个 Server 的失败不会传播到另一个。asyncfunctionsafeCall(client,toolName,args){try{returnawaitclient.callTool(toolName,args);}catch(err){console.error([${client.id}] Tool${toolName}failed:,err.message);return{error:true,message:暂无法访问${client.id}};}}其实就是加了个错误边界但效果很明显——一个 Server 挂掉不会影响另一个。多 Server 管理的决策框架写完这个项目之后我自己整理了一个判断逻辑什么场景下用什么策略场景推荐方案原因两个 Server 功能完全不重叠命名空间前缀直接拆简单互不干扰Server 数量 3 但功能有交集代理聚合模式统一入口减少 AI 选择成本有 Server 偶尔超时/不稳定独立超时 try/catch 隔离一个挂了不拖累全局多个 Server 服务同一场景合并成一个 Server减少跨 Server 通信外部不可控 Server第三方包装层 降级策略不能假设第三方永远可用代理聚合模式是什么就是用一层代理 Server 包装下面多个子 Server 的 Tool对外只有一个入口。子 Server 的 Tool 全部通过代理转发Client 只需要连一个代理 Server 就行。适合 Server 数量多的时候减少 AI 面对的选择空间。这个方案的边界以上做法能解决大部分多 Server 集成问题但不是银弹。命名空间前缀有一类场景搞不定——当 LLM 需要跨两个 Server 的数据做推理时。比如对比数据库里张三的订单和文件系统里张三的简历AI 需要同时调 db_search 和 fs_search两次结果合并做分析。前缀方案只能防选错不能加速跨 Server 协作。跨 Server 数据融合是另一个话题了可能需要 Client 侧做一层缓存或结果聚合。这个我还没完全想好目前遇到的对比例子不多方案还不够成熟。另外超时配置的数值得根据实际场景调。我设的 8 秒和 3 秒是基于本地测试的放到线上环境网络延迟不同要重新压测。具体设多少没有万能公式我自己的做法是先设成 5 秒跑一周看日志如果有 Tool 频繁超时就调大如果服务器响应都很稳定就逐步缩紧。你现在就可以做的一件事打开你的 MCP 配置文件一般是mcp.json或claude_desktop_config.json看看有没有配多个 Server。如果有检查一下它们的 Tool 名字——有没有同名的如果有加个前缀花不了五分钟但能省掉后面排查AI 为什么拿错数据的时间。我当时就是觉得两个 search 应该没关系吧——结果查了接近两小时才发现是这个原因。这个亏吃一次就够了。

相关新闻

AstrBot:一个以「IM 平台粘合剂」为核心竞争力的开源 AI Agent 框架

AstrBot:一个以「IM 平台粘合剂」为核心竞争力的开源 AI Agent 框架

信源已充分收集,现在输出完整笔记。 AstrBot:一个以「IM 平台粘合剂」为核心竞争力的开源 AI Agent 框架 项目地址:github.com/AstrBotDevs/AstrBot | Stars: ~28.4k | 许可证: AGPL-3.0 | 主语言: Python 3.12 核心观点 AstrBot 的本质不是…

2026/7/21 8:13:09阅读更多 →
Windows 11必备效率工具全解析

Windows 11必备效率工具全解析

1. Windows 11必备工具全景解析作为从Windows 95时代就开始折腾系统的老用户,我见证了操作系统从简陋到精致的演变过程。Windows 11无疑是微软近年来最具革新性的版本,但就像精装修的房子需要软装搭配一样,系统原生的功能总有些让人不顺手的地…

2026/7/21 8:11:09阅读更多 →
2026 最火 AI Agent 智能体开发实战:用 LangChain + LangGraph 从零构建企业级多智能体协作系统

2026 最火 AI Agent 智能体开发实战:用 LangChain + LangGraph 从零构建企业级多智能体协作系统

🔥 2026 最火 AI Agent 智能体开发实战:用 LangChain LangGraph 从零构建企业级多智能体协作系统 ![AI Agent 智能体开发](cover.jpg) **摘要**:2026 年 WAIC 现场,AI Agent(智能体)成为绝对主角——从&qu…

2026/7/21 8:11:09阅读更多 →
AI建站工具怎么选?一份真实用的对比指南与筛选标准

AI建站工具怎么选?一份真实用的对比指南与筛选标准

面对市面上琳琅满目的建站工具,很多人都会陷入选择困难。是选操作简单的,还是功能强大的?是相信“AI生成”,还是继续用传统模板?这篇指南的核心目的,不是直接告诉你“买哪个”,而是帮你建立一套…

2026/7/21 17:12:06阅读更多 →
delete-docker-registry-image:解决私有Docker仓库磁盘占用问题的终极工具

delete-docker-registry-image:解决私有Docker仓库磁盘占用问题的终极工具

delete-docker-registry-image:解决私有Docker仓库磁盘占用问题的终极工具 【免费下载链接】delete-docker-registry-image If you are running a private v2 docker registry, and you are storing your data on disk, running this script from the machine where…

2026/7/21 17:12:06阅读更多 →
Camellia核心组件解析:从架构到实现原理

Camellia核心组件解析:从架构到实现原理

Camellia核心组件解析:从架构到实现原理 【免费下载链接】camellia Camellia provide easy-to-use server toolkits, such as: redis proxy、delay queue、id gen、hot key and more 项目地址: https://gitcode.com/gh_mirrors/ca/camellia Camellia是网易云…

2026/7/21 17:12:06阅读更多 →
DeepONet处理分数阶微积分:1D Caputo导数案例详解

DeepONet处理分数阶微积分:1D Caputo导数案例详解

DeepONet处理分数阶微积分:1D Caputo导数案例详解 【免费下载链接】deeponet Learning nonlinear operators via DeepONet based on the universal approximation theorem of operators 项目地址: https://gitcode.com/gh_mirrors/de/deeponet 分数阶微积分作…

2026/7/21 17:12:06阅读更多 →
SRS WebRTC配置教程:3步实现低延迟实时音视频传输

SRS WebRTC配置教程:3步实现低延迟实时音视频传输

SRS WebRTC配置教程:3步实现低延迟实时音视频传输 【免费下载链接】srs Please use https://github.com/ossrs/srs because this is my personal experimental repository, so its not updated and not stable. 项目地址: https://gitcode.com/gh_mirrors/srs1/sr…

2026/7/21 17:12:06阅读更多 →
Unity Multiplayer:10个Netcode for GameObjects核心概念解析与实战技巧

Unity Multiplayer:10个Netcode for GameObjects核心概念解析与实战技巧

Unity Multiplayer:10个Netcode for GameObjects核心概念解析与实战技巧 【免费下载链接】com.unity.multiplayer.docs [ARCHIVED] Open Source documentation for Unity Multiplayer, which includes Netcode for GameObjects, the Unity Transport Package, Multi…

2026/7/21 17:10:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →