MCP 学习笔记:如何用 Zod 给“概率性”的 AI 套上缰绳

4 阅读3分钟

最近这段时间,我深入了解了 MCP (Model Context Protocol),并动手写了两个“小玩具”来练手:一个是根据文件名自动整理图片的工具,另一个是获取外部接口数据的工具。

在开发过程中,我不仅搞懂了 MCP 是什么,更深刻体会到了在 AI 开发中“确定性”的重要性。今天就来复盘一下我的学习路径,重点聊聊如何用 Zod 来解决 AI 输出不稳定的问题。

什么是 MCP?

简单来说,MCP 就是 AI 的工具箱。

在没有 MCP 之前,AI 对我们来说更像是一个“博学的网友”。它只能通过对话告诉你各种信息,或者给你写段代码,但它无法直接触达你的本地文件,也无法直接操作你的系统。

而 MCP 的出现,打破了这个次元壁。它允许 AI 从协议中获取“工具”(Tools),然后去执行具体的操作。如果说以前的 AI 只有“脑子”和“嘴巴”,那么加上 MCP 后,它终于有了“手”。


从零开始:制作一个简单的 MCP

制作一个 MCP Server 的过程其实并不复杂,核心流程可以总结为“三步走”:

  1. 导入包:引入 MCP 相关的 SDK。
  2. 创建服务器:初始化一个 MCP Server 实例。
  3. 定义与添加工具:这是最关键的一步。我们需要告诉 AI 我有哪些工具(比如 move_imagefetch_weather),以及怎么用这些工具。

代码写完,跑起来,一个基本的 MCP 就完成了。看起来很简单,对吧?但在实际运行中,我遇到了一个不得不面对的问题。


核心挑战:AI 的“概率” VS 程序的“严谨”

作为一个开发者,我们都知道程序是严谨的。函数需要的参数如果是 Object,你就不能传 String;需要的路径如果是绝对路径,你就不能给个相对路径。

但是,AI 的本质是概率模型。

AI 的一切输出都仅仅是基于概率的预测。没人能 100% 确信 AI 下一次输出的 JSON 格式是否完美符合代码的预期。

  • 它可能会少一个大括号;
  • 可能会把 userId 写成 user_id
  • 甚至可能在 JSON 里夹杂一段“好的,这是你要的数据”这样的闲聊文本。

如果直接把 AI 的输出灌入程序,结果往往是报错崩盘。


解决方案:用 Zod 充当“守门员”

为了解决这个问题,我引入了一个非常重要的库——Zod

Zod 是一个 TypeScript 的模式声明和验证库。在 MCP 开发中,它的使用并不难,但作用却是决定性的。我总结了它最重要的两个作用:

1. 定义“说明书” (Schema Definition)

我们需要用 Zod 清晰地定义工具的输入格式(Input Schema)。

例如,我的“图片整理工具”需要一个文件路径。我会用 Zod 定义这是一个 string,并且可以加上 .describe("图片的绝对路径")。MCP 会把这个定义转译给 AI 看,让 AI 明确知道:

“哦,调用这个工具时,我必须提供一个字符串格式的路径。”

2. 强制“安检” (Validation)

这是 Zod 最核心的点。当 AI 试图调用工具时,它的请求会先经过 Zod 的检查:

  • 如果符合格式:Zod 放行,程序执行工具逻辑。
  • 如果不符合:Zod 会拦截请求,并抛出一个格式化的错误。

这就形成了一个闭环:定义格式 -> AI 尝试调用 -> Zod 验证 -> 执行或报错


总结

通过这几天的学习,我的感悟是: MCP 给了 AI 操作世界的能力,而 Zod 给了这种操作安全性和稳定性。

如果不加验证,AI 只是一个容易闯祸的顽童;加上了 Zod 的验证,它才能变成一个靠谱的助手。这就是我开发那两个小工具时最大的收获。