第 02 模块 · 4 节

安全与错误处理

《Claude Code 生产级工程》02 MCP 服务集成 · 本节时长 34 分钟

MCP 是把双刃剑

MCP 给了模型访问外部系统的能力——能力越大,责任越大。一个没做好安全与错误处理的 Server,可能让模型在业务系统里乱来,或把错误信息糊一脸。

这一节,把安全与错误处理做扎实。

贯穿项目mcp-hub 是**团队共享**的,所以它的安全责任是「放大」的——一个人的误配置,可能影响全员能触达的业务系统。这一节,你把安全与错误处理做成 mcp-hub 的**默认配置**,而不是某个 Server 的「附加项」。**mcp-hub 越安全,团队才敢让全员接入。**

安全:先回答三个问题

任何一个 MCP Server 上线前,问自己:

  1. 它能碰什么? 权限边界清不清楚
  2. 凭据安全吗? 密钥有没有泄漏风险
  3. 会被误用吗? 模型会不会触发不该触发的操作

三个问题答清楚,安全才有底。

对 mcp-hub 来说,这三个问题要写进 mcp-hub 的校验流程——每次 /mcp-hub add 一个新服务,就自动过这三关,而不是靠每个成员自觉。


安全实践清单

  • 最小权限:只暴露完成任务必要的工具,其余藏起来
  • 只读优先:默认提供只读能力(查询),写操作(改、删)要严格把关
  • 敏感操作确认:删除、改数据这类操作,在 Server 端也做二次确认或限制
  • 凭据不入库:密钥放环境变量/密钥管理,别硬编码进明文文件
  • 输入校验:模型传进来的参数要校验,防止恶意/异常输入打到你的服务
心法把 MCP Server 当成「对外开放的小接口」来对待——它暴露给模型的能力,就等于暴露给了一个不可完全信任的执行者。

把这条清单做成 mcp-hub 的「接入门槛」:服务登记时逐条检查,不满足就拦下,让负责人先补上再接入。


错误处理:别让模型「一脸懵」

模型调你的服务失败了,你希望它能理解发生了什么,而不是得到一堆乱码。

好的错误处理:

  • 返回可读的错误:说明「为什么失败、参数对不对、怎么修」
  • 区分错误类型:是「服务不可用」「参数错误」还是「没权限」
  • 提供修复建议:让模型能自己纠正后重试

示例对比:

❌ 返回 500 - {"err": "null pointer"} → 模型看不懂 ✅ 返回 查询失败:缺少 start_date 参数,请带上后重试 → 模型能修正

对 mcp-hub 意义更大:它是团队共享的,错误信息要能被模型读懂、被同事看懂。一条「缺少参数、请补上」比一屏堆栈有用得多。


异常场景要覆盖

写 Server 时,主动覆盖这些场景:

场景 处理
服务超时 设超时,返回「服务响应超时」
被限流 返回「请求过快,稍后重试」
参数非法 校验并返回「参数 X 不符合要求」
凭据失效 返回「认证失败」而非堆栈

每一个异常都给出「可理解、可行动」的返回。

把这套异常覆盖做成 mcp-hub 里每个 Server 的统一模板,团队写新 Server 时直接套用,保证所有服务的报错风格一致。


一个可复制的错误返回模板

给 Server 的错误处理定一个统一结构,mcp-hub 团队内通用:

{
  "ok": false,
  "error": {
    "type": "invalid_params",
    "message": "缺少 start_date 参数",
    "hint": "请带上 start_date(格式 YYYY-MM-DD)后重试"
  }
}

结构统一后,模型和同事都能一眼看懂「哪里错、怎么修」,而不是面对一堆裸错误码。


测试你的 Server

别写完就上线。做这几件事:

  • 正常路径:正确参数,返回正确结果
  • 异常路径:非法参数、超时、无权限,返回可读错误
  • 安全边界:尝试访问它不该碰的东西,确认被拦

安全与错误处理,靠测试来兜底。

对 mcp-hub:把这三类测试做成 mcp-hub 的接入门槛——新服务要能过这三关才允许正式上线给团队用。


落地练习:给 mcp-hub 定安全与错误基线

这一节,把「安全 + 错误处理」固化成 mcp-hub 的标准。

跟着这三步走:

  1. 用「安全实践清单」逐条检查你 mcp-hub 已接入的服务,标出哪些不达标
  2. 给 mcp-hub 的 Server 套上统一的「错误返回模板」(参考上面的 JSON)
  3. 按「正常 / 异常 / 安全边界」三类,给已接入的服务各测一遍

你会怎么判断做对了?——每个服务都过了安全清单、报错都是可读的 JSON(含 type/message/hint)、三类测试都覆盖到,就算过关。

卡住了怎么办? 不想测试每个服务?至少把一个服务的三类测试完整做一遍,其余套用同样方法。错误模板拿不准?就用上面的 JSON 结构,先统一起来,后面再调。


常见坑:只做了「安全」或「错误处理」的其中一个

新手常偏科:要么狂堆权限控制,报错时却糊一屏堆栈;要么报错写得很好,权限却敞开着。安全和错误处理是一体两面——安全决定「能不能进来」,错误处理决定「进来后出事能不能看懂」。

mcp-hub 要同时抓好:接入门槛(安全)和统一报错(可读性)双管齐下。只抓一头,生产环境迟早出事。 把两者都做成 mcp-hub 的默认基线,而不是二选一。


小结

  1. MCP 能力大、责任大,安全第一
  2. 安全实践:最小权限、只读优先、敏感操作把关、凭据不泄露、输入校验
  3. 错误处理:返回可读、可行动的提示,让模型能纠正
  4. 覆盖异常场景 + 主动测试
  5. mcp-hub 把安全与错误处理做成团队默认基线

下一模块进入「性能与成本优化」。