设计大模型不会误解的 MCP 工具的七个黄金法则
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
构建模型上下文协议 (Model Context Protocol, 简称 MCP) 服务器与设计传统的 REST API 有着本质的不同。当你的 API 读取者是一个大语言模型,而不是人类开发者或结构化前端时,交互规则发生了彻底的改变。模型会阅读你的工具列表,挑选一个工具,并将返回的结果直接转换成自然语言复述给人类用户。它不会通读你的长篇文档,不会提出追问,并且会极其自信地用猜测填补每一个数据空白。
当我们为 supp.fit 构建 MCP 服务器时,我们遇到了这些完全相同的挑战。supp.fit 是一个包含来自随机对照试验的补充剂科学证据数据库。其中的数据很容易以关键的方式被误解:不同单位的剂量、无法匹配的产品标签、缺少记录日期的摄入日志。为了解决这些问题,我们总结出了七条严格的架构规则。虽然这些规则源于健康数据,但它们同样适用于任何稳健的 MCP 服务器基础设施,无论你是通过 n1n.ai 接入高性能大模型,还是构建自定义内部工具。
1. 每个用户问题对应一个工具,而不是每个路由对应一个工具
传统的 REST API 青睐细粒度的路由:/users/{id}/stack、/products/{id}/ingredients、/studies/search。如果你将后端每一个路由直接映射为一个 MCP 工具,你的工具列表将膨胀到数十个选项。
当模型面对两个名称或描述仅差一个单词的工具时,其概率分布会趋于扁平,从而经常随机选择其中一个。此外,如果你依赖像 n1n.ai 这样聚合器提供的极速大模型推理层,通过最小化工具冗余来保持上下文窗口干净,对于降低延迟和提高准确率至关重要。
为了解决这个问题,我们的 API 拥有四十多个端点,但我们的 MCP 服务器仅对外暴露了十三个工具。我们将多个端点合并为单一职责的工具,每个工具只回答一种特定类型的问题:搜索补充剂、获取单个补充剂、获取其研究方案、获取某个健康益处背后的研究、获取单项研究、搜索产品、获取单个产品,以及六个针对用户个人数据的专用工具。
2. 明确定义每个空字段的具体含义
数据库中的两个字段可能出于完全相反的原因而为空,但没有明确引导的大语言模型会将它们同样视为“空”或“无”。
例如,在我们的产品数据库中:
- 缺少“补充剂成分表 (Supplement Facts)”面板的产品,通常意味着条形码无法与注册标签库匹配。这绝不意味着该产品不含任何成分。
- 没有摄入答案的日期意味着当天没有人填写记录。这绝不意味着用户漏服了剂量。
如果没有明确的防护栏,模型会非常高兴地输出诸如“该产品不含任何成分”或“你连续 12天漏服”之类有害的幻觉内容。
专业提示:将明确的否定约束直接嵌入工具描述字符串中:
当 has_confirmed_label 为 false 时表示没有面板,这意味
着匹配无法被确认。这绝不意味着该产品不含有任何成分。
永远不要告诉读者某个产品不含任何东西。
3. 禁止危险的算术运算和单位转换
大语言模型非常喜欢做数学题,但它们在单位转换和跨类型聚合方面的表现历来糟糕。剂量数据常以国际单位 (IU)、毫克 (mg)、胶囊和毫升为单位出现。看到一堆数字的模型会兴高采烈地将它们相加,更糟糕的是,它会使用不准确的启发式算法将 IU 转换为毫克。
为了防止这种情况,必须强制执行结构和文本约束:
| 规则 | 实现策略 |
|---|---|
| 禁止跨单位求和 | 在描述中明确说明:“每个数量保持其自身的单位;不要跨单位或跨项目相加数量。” |
| 禁止自动换算 | 禁止盲目猜测像 IU 这样的生物活性单位的质量等效值。 |
| 结构化响应 | 调整你的 JSON 响应结构,使消费数据严格按项目和单位分组,从而让错误的加法在结构上难以执行。 |
通过像 n1n.ai 这样强大的 API 基础设施集成这些模型时,确保你的输出架构强制执行严格的类型定义,将进一步减少算术幻觉。
4. 明确指出每个数字的来源
在处理定量指标时,上下文就是一切。临床试验中的研究小组采用每日定量方案。商业产品标签印刷的是每份推荐量。这两者都不是对用户的医疗建议。
我们的研究方案工具同时返回这两个指标,并附带中位数、中间一半(四分位距)以及最常见的剂量区间。至关重要的是,工具描述明确指出了它们的来源:“印刷的和研究过的用量,而不是推荐剂量。”这使模型能够准确回答“临床试验使用的是什么剂量?”之类的问题,而不会将其转化为危险的个人医疗建议。
5. 强制执行只读架构并消除虚构的写操作工具
安全性不仅仅关乎授权令牌,它还关乎引导模型的认知行为。我们 MCP 服务器中的每个工具都严格实行只读,且服务器架构到数据库没有写路径。
此外,服务器自身不保留任何密钥。它只是透传客户端获取到的令牌,由上游 API 决定该令牌被允许读取哪些内容。
这种设计提供了一种强大的安全属性,同时也辅助了模型的推理。在工具声明列表中没有任何写操作工具的情况下,模型永远不会在大模型对话中幻觉出诸如“是否要将此补充剂添加到你的每日组合中?”之类的主动写入承诺。
6. 按数据所有者划分作用域并统一鉴权规则
我们的平台采用两种不同的 OAuth 作用域:
evidence.read:涵盖公开的科学补充剂、研究和产品(不包含任何个人数据)。me.read:涵盖用户的个人私密数据,包括个人组合、历史记录和摄入日志。
这些作用域在用户授权页面上是独立的复选框,因此个人可以共享科学证据部分,同时保留其个人健康隐私。
然而,每个工具都需要一个登录账号,即使是那些读取公共证据的工具也是如此。原因何在?因为 AI 助手经常需要将两部分混合在一个回答中(例如:“研究是怎么说的,我目前在服用什么?”)。在所有工具中保持单一的鉴权规则可以被轻松测试,而针对每个工具设置不同规则则是人们容易遗漏的隐患。
7. 提供摘要加验证链接
完整论文文本受版权许可保护,因此没有任何工具会返回原始论文正文。相反,研究工具返回的是标题、年份、参与者人数、我们的专家总结以及 PubMed 链接。
这为模型提供了足够的内容来准确命名论文,同时也为人类读者提供了直接核查的验证路径。
稳健 MCP 服务器总结核对表
| 规则 | 核心目标 |
|---|---|
| 工具少于端点 | 防止模型混淆和随机挑选工具 |
| 说明空白含义 | 消除错误的“无”或零值幻觉 |
| 禁止错误算术 | 防止跨单位求和与糟糕的单位换算 |
| 标明数字来源 | 区分临床试验数据与医疗建议 |
| 只读并明确声明 | 防止在聊天界面中出现虚构的写入动作 |
| 按数据所有者划分作用域 | 在保护隐私的同时维持统一鉴权 |
| 摘要加链接 | 实现准确引用与人类交叉验证 |
准备好为你的自定义 MCP 服务器部署高速、可靠的大语言模型集成服务了吗?立即在 n1n.ai 获取免费 API 密钥。