[控场AI]
· 8 分钟阅读· 4,445 字

从零构建首个AI Agent:用MCP让大模型突破知识截止点

从零构建首个AI Agent:用MCP让大模型突破知识截止点

30分钟实战课:用MCP协议和FastMCP让大模型突破知识截止点、调用实时股价数据。

本文记录了一场名为「Zero to Agent」的实战演示课程核心内容。讲师 Bruce 以实时股票价格查询为例,展示了如何借助 MCP(模型上下文协议)让大语言模型突破训练知识截止点的限制。文章从协议原理(类比 HTTP 的 JSON-RPC 架构)、两种传输方式(本地 stdio 与可远程的 Streamable HTTP)、三类核心原语(工具、资源、提示词规范)到安全护栏和与 Skill 的协同关系,逐层拆解了 MCP 的完整知识体系。配合 FastMCP 框架和 UV 包管理器,作者指出仅需数十行代码即可搭建出第一个具备实时数据能力的 Agent,为入门 Agent 开发提供了一条清晰可复制的路径。

MCP 为什么突然火了

大语言模型最大的局限之一,是知识截止点(knowledge cutoff)。它们熟悉训练数据里的公开信息,却对训练之后发生的一切一无所知——比如此刻苹果股票的实时价格。MCP(Model Context Protocol,模型上下文协议)正是为解决这个问题而生。

讲师 Bruce 在这场名为「Zero to Agent」的 30 分钟实战课中指出,MCP 的普及速度惊人:仅 Python 版 SDK 每月下载量就超过 3 亿次,Node.js 版本也超过 1.8 亿次。这组数据说明 MCP 已经不是实验性概念,而是正在被大规模采用的工程标准。

整场演示围绕一个核心目标:构建你的第一个 Agent,让模型能够调用外部工具获取实时数据。

一个让模型「开眼」的实时股价演示

Bruce 先用 Claude Desktop 做了直接验证。他询问模型的知识截止日期,Sonnet 回答是「2026年6月底」。接着他问「苹果股票现在多少钱」,由于已经连接了自己编写的股票 MCP 服务器,模型自动找到对应工具、调用背后的 12 Data API,返回了实时价格:337 美元,当日上涨 8 美元,前收盘价 329 美元。

从 fast MCP 导入依赖

这个过程的关键在于:模型本身并不知道答案,但通过 MCP 工具调用,它把问题「外包」给了能回答的服务。这正是 MCP 扩展大模型能力边界的核心价值——让对话突破训练截止日期。

更有意思的是自定义 URI。Bruce 演示输入 stock://GOOG,返回了谷歌股价 347 美元、上涨 10 美元。stock:// 并非 HTTP、HTTPS 这类标准协议,而是他在代码里自定义的 URI,只在他和模型之间有意义。这为编排多个 MCP 服务器提供了优雅的寻址方式。

MCP 的协议原理:类比 HTTP 理解

Bruce 用大家每天都在用的 HTTP 来类比 MCP,这个讲法非常好理解。

消息协议层面:HTTP 有客户端(浏览器)、服务器(Web 服务器),两者之间传输 HTML。MCP 则有 MCP 客户端(Claude Desktop、VS Code、ChatGPT 等任何带大模型的宿主)、MCP 服务器(你自己写的代码),两者之间传输的是 JSON——准确说是 JSON-RPC。

RPC 即 Remote Procedure Call(远程过程调用)。服务器把 JSON 抛给客户端,客户端读取后就能在服务器上发起远程调用。例如客户端询问「你有哪些功能」时,会发送 tools/list 请求,服务器返回一个工具数组,每个工具包含名称、自然语言描述和输入 schema。模型会同时阅读名称与描述,因此描述写得清楚与否直接影响调用效果。

创建 MCP 服务器本身只需一行代码:mcp = FastMCP("任意名称")。在完整代码里,还需加载环境变量、设置 API Key、初始化 12 Data 客户端。

JSON-RPC 是一种轻量级远程过程调用协议,使用 JSON 作为数据格式。与 REST API 不同,它不依赖 HTTP 动词(GET/POST 等)来表达语义,而是通过消息体中的 method 字段指定要调用的方法,params 字段传递参数,id 字段用于匹配请求与响应。在 MCP 语境下,客户端发送的每条消息都遵循这一结构,例如 {"jsonrpc": "2.0", "method": "tools/list", "id": 1},服务器则返回对应 id 的结果。这种设计让 MCP 天然具备语言无关性——无论服务器用 Python、Node.js 还是 Go 编写,只要能收发 JSON,就能接入同一个客户端。

传输层:stdio 与 streamable HTTP 的取舍

HTTP 传输时服务器需要先运行

MCP 支持两种传输方式,选择哪一种直接决定了部署架构:

标准输入输出(stdio)

如果使用 stdio,MCP 客户端和服务器必须严格运行在同一台机器上,意味着只能做本地服务器。此时标准输出要用于日志,标准输入不能用于接收数据——因为这两者就是传输通道本身。stdio 模式下无需手动启动服务器,客户端会负责拉起它。

Streamable HTTP

如果使用 streamable HTTP,客户端和服务器可以位于任意位置——本地、局域网或互联网都行。但规则和普通 HTTP 服务器一样:服务器必须先运行起来,客户端才能连接。就像访问 amazon.com 前,亚马逊的服务器必须已经在线。

代码里设置传输方式同样极简:mcp.run()。不指定时默认走 stdio;若要用 HTTP,则显式声明即可。

"Streamable HTTP" 是 MCP 规范中对服务器推送能力的具体实现方式,区别于传统的请求-响应式 HTTP。传统 HTTP 是客户端主动发起、服务器被动响应的单向模式;而 MCP 的工具调用往往需要服务器在执行过程中持续推送进度或流式返回结果。Streamable HTTP 借鉴了 Server-Sent Events(SSE)的思路,允许服务器在单次 HTTP 连接中持续写入数据,客户端实时消费,而不必等待整个响应完成。这一机制对于执行时间较长的工具调用(如查询大型数据库或调用第三方 API)尤为重要,避免了客户端因超时而误判失败。

工具、资源与提示词:三类核心原语

MCP 把 AI 化的功能分为工具(tool)和资源(resource)两类,区分标准清晰:

工具(tool):当函数需要读取并返回单一值(布尔、整数、浮点、字符串这类基本类型),或需要执行某个动作(开关灯、播放/停止音乐、存储记录)时,就是工具。声明方式是 @mcp.tool 装饰器。Bruce 为股票写了 get_current_stock_price 和 get_historical_stock_price 两个工具。

资源(resource):当函数需要访问大型数据仓库(文件系统、数据库、代码库)时使用,这些内容远超一个字符串能容纳的大小。声明方式是 @mcp.resource。

模型能自动查出股票代码

Bruce 特别强调:严格来说股票服务更应是资源,但并非所有 MCP 客户端都稳定支持资源。而且资源还有一个独特价值——只有通过资源才能定义自定义 URI。那段 stock:// 的魔法就在资源声明里实现,它告诉模型「看到这种格式就调用我」。他举例,企业服务台可以定义 company://vacation 查假期政策、company://expenses 提交报销单,从而优雅地编排多个服务。

提示词规范(prompt):MCP 里的 prompt 不是我们平常理解的用户提问,而是写在代码里、供模型阅读的示例提示。它让模型看到「该如何调用这个服务器」的样例,用 @mcp.prompt 装饰器声明。

配置与安全:让 Claude 找到你的服务器

UV 工具运行速度极快

依赖管理上,Bruce 推荐用 UV 替代 pip,号称速度快 100 倍,安装命令为 uv add "mcp[cli]"。

配置 Claude Desktop 识别 MCP 服务器也很简单:编辑 claude_desktop_config 文件,在 mcpServers 段落填入运行命令(如 uv)和参数(服务器脚本的完整路径)即可。配置完成后,Claude 内就出现了名为 stocks 的服务器。

关于安全与护栏

问答环节中,几个问题颇有价值:

  • 恶意输入:当有人尝试输入 C:\users\你的AWS凭证 这类路径时,现在的模型已经足够聪明,能识别并拒绝。
  • 恶意工具描述:要执行本地 MCP 服务器,用户端必须具备运行时(UV、Python 等)。如果改用远程 MCP 服务器,用户无需任何本地运行时,只需认证登录,本地不会被调用任何代码——这是最严格的安全方案。
  • 显式护栏:可以明确限制操作权限。例如数据库 MCP 服务器可设定为只读,禁止 insert、update、delete 等破坏性操作,防止有人通过自然语言删库或乱建工单。

UV 是由 Astral 团队(也是 Ruff 代码格式化工具的开发者)用 Rust 编写的 Python 包管理器与项目管理工具,于 2024 年初发布后迅速成为社区热点。它通过并行下载、全局依赖缓存以及避免重复解析依赖树等机制实现大幅提速,在依赖项较多的项目中相比 pip 的速度优势尤为明显。对 MCP 开发而言,UV 的另一个优势是内置了虚拟环境管理:uv run 命令能在隔离环境中直接执行脚本,无需手动激活 venv,这使得在 claude_desktop_config 中配置启动命令变得更加简洁和可移植。

MCP 与 Skill 不是对立,而是协同

最后一个问题触及很多人的困惑:MCP 和自定义 Skill 该怎么选?Bruce 的答案是——它们根本不冲突,而是配合使用。

Skill 本质是一个 Markdown 文件(可加脚本),作用是教模型「每次都用同样的方式做某件事」。因为大模型是非确定性的,Skill 能带来一致性。比如天气 MCP 服务器,如果不加约束,Claude 可能绕过它自己去查天气;而一个 Skill 就能规定「只要用户问天气,就必须调用这个服务器」。

Bruce 指出,ChatGPT 和 Claude 的插件体系本身就是把 MCP 服务器与 Skill 配对使用的。MCP 负责「能做什么」,Skill 负责「何时、如何稳定地触发」,两者相得益彰。

小结

这场紧凑的实战课把 MCP 从概念讲到可运行代码:核心是用 JSON-RPC 协议、stdio 或 HTTP 传输,通过工具、资源和提示词三类原语,让大模型突破知识截止点、调用实时数据。配合 FastMCP 和 UV,几十行代码就能搭出第一个 Agent。对想入门 Agent 开发的人来说,这是一条清晰可复制的路径。

分享:

相关推荐