AI-05 拓展能力:Tool Calling、MCP 与智能体¶
让模型在受控范围内使用工具,而不是把系统权限交给模型¶
模型可以建议调用什么,系统必须决定能不能调用
普通问答只能根据已有上下文生成文字。如果用户问“我的教室借用申请审核到哪一步了”,模型本身不知道业务数据库中的最新状态。Tool Calling 可以让模型提出一个结构化工具调用,由项目后端校验权限、执行真实业务查询,再把结果交给模型组织回答。
MCP(Model Context Protocol,模型上下文协议)进一步规定了 AI 应用发现和调用外部工具、读取资源和使用提示模板的通用方式。智能体则在模型、工具和运行循环的基础上,根据目标分多步完成任务。
三者都扩展了模型能力,也放大了权限、误操作和提示注入风险。本节以理解概念和完成一个只读工具为主,不要求学生构建能够自主修改系统的复杂智能体。
本节学习目标
理解 Tool Calling 的完整循环,能够定义一个参数明确、权限受控的只读业务工具;区分 Tool Calling、MCP 和智能体;认识 MCP 的 Host、Client、Server 及 Tools、Resources、Prompts;为工具调用设计参数校验、用户确认、审计、超时和循环上限。
返回上一节:智能生成、分类与推荐 返回扩展篇导读 进入下一节:安全、成本、降级与演示
🎯 本节完成后,你要交付¶
| 成果 | 要求 |
|---|---|
| 工具场景说明 | 明确用户目标、工具能力、输入、输出和禁止事项 |
| 一个只读工具 | 能查询当前用户有权访问的真实业务数据 |
| 工具定义 | 名称、说明和输入 Schema 清晰、范围最小 |
| 受控调用循环 | 模型建议调用,后端校验并执行,结果返回模型 |
| 权限与审计记录 | 不信任模型参数,记录谁在何时调用了什么 |
| MCP 概念说明 | 能区分 Host、Client、Server、Tool、Resource、Prompt |
| 安全测试 | 覆盖越权、无效参数、重复调用、超时和提示注入 |
本节以只读工具为最低实现
第一次实践不要让模型直接删除数据、发送消息、扣减库存、改变权限或提交正式申请。先完成一个只读查询工具,证明权限、参数、审计和失败处理都正确,再讨论写操作。
一、先区分三个概念¶
1. Tool Calling:模型提出结构化调用¶
Tool Calling 也常被称为 Function Calling。基本过程是:
模型不会替应用执行 Java 方法
模型只产生结构化调用意图。真正访问数据库、调用接口和修改数据的是项目后端。后端可以拒绝、修改或要求用户确认这次调用。
2. MCP:连接 AI 应用与外部能力的通用协议¶
MCP 是用于连接 AI 应用与外部系统的开放标准。它使用 Client—Server 架构,让 AI 应用通过统一协议发现和使用 Tools、Resources、Prompts 等能力。
MCP 解决“怎样标准化连接和发现能力”的问题,但不替项目决定业务权限,也不自动把普通程序变成智能体。
3. 智能体:围绕目标进行多步决策和执行¶
一个最小智能体循环可以表示为:
智能体通常包含:
- 模型;
- 工具集合;
- 当前任务和上下文;
- 多步运行循环;
- 状态、停止条件和错误处理;
- 权限、确认和审计。
4. 三者关系¶
| 概念 | 主要解决的问题 | 是否必须使用其他两者 |
|---|---|---|
| Tool Calling | 模型怎样提出结构化工具调用 | 不必须使用 MCP |
| MCP | AI 应用怎样以统一协议连接能力 | 不等于智能体 |
| 智能体 | 怎样围绕目标进行多步决策 | 可使用普通工具或 MCP 工具 |
可以存在:
- 使用 Tool Calling、但没有 MCP 的业务助手;
- 使用 MCP 读取资源、但不进行多步智能体循环的客户端;
- 使用普通 Java 工具注册表实现的简单智能体;
- 同时使用 Tool Calling、MCP 和智能体的复杂应用。
二、选择一个范围安全的工具场景¶
1. 推荐的入门工具¶
| 工具 | 类型 | 作用 | 风险 |
|---|---|---|---|
search_service_guides |
只读 | 查询公开办事指南 | 低 |
get_my_application_status |
只读 | 查询当前用户自己的申请 | 中,涉及身份与数据权限 |
list_available_rooms |
只读 | 查询可预约教室 | 中,涉及实时状态 |
calculate_borrowing_days |
计算 | 根据规则计算借用天数 | 低 |
create_material_checklist |
本地生成 | 根据事项形成清单草稿 | 低 |
2. 不适合作为第一次工具¶
- 删除用户或业务记录;
- 修改角色和权限;
- 自动批准或拒绝申请;
- 代替用户发送正式通知;
- 自动支付、退款或转账;
- 批量下载私有数据;
- 执行任意 SQL、Shell 或代码;
- 接受任意 URL 并访问;
- 将模型传入的
userId当作当前用户身份。
3. 工具任务卡¶
| 项目 | 内容 |
|---|---|
| 工具名称 | 【填写】 |
| 用户目标 | 【用户为什么需要它】 |
| 工具类型 | 【查询 / 计算 / 草稿 / 写操作】 |
| 输入参数 | 【最少需要哪些参数】 |
| 身份来源 | 【从登录状态读取什么】 |
| 输出数据 | 【只返回哪些必要字段】 |
| 权限规则 | 【谁能调用、能看哪些数据】 |
| 是否确认 | 【调用前是否需要用户同意】 |
| 是否可重试 | 【重复执行是否安全】 |
| 超时与限制 | 【时长、数量和频率】 |
| 审计内容 | 【记录哪些信息】 |
| 禁止事项 | 【工具绝不能做什么】 |
示例:查询本人申请状态¶
三、定义一个清晰的 Tool¶
1. 工具定义包含什么¶
模型通常需要知道:
- 工具名称;
- 工具用途和适用时机;
- 参数名称、类型和含义;
- 哪些参数必填;
- 可选值和范围;
- 工具不能完成什么。
JSON Schema 示例:
2. 好名称比“万能工具”更安全¶
避免:
推荐:
工具名称应反映最小能力,工具描述应说明边界。
3. 不让模型提供身份¶
错误参数:
模型和用户都可以伪造 userId 与 role。
推荐方式:
身份来自已经验证的 JWT 或 Session,不能来自模型调用参数。
4. 输出也要最小化¶
不要因为数据库实体中有手机号、身份证号、内部备注和审核人信息,就把整个 Entity 序列化给模型。
四、实现后端工具注册表¶
课程项目可以先使用普通 Java 接口理解工具调度,不必立即引入 MCP SDK。
1. 工具接口¶
执行上下文由后端创建:
2. 查询本人申请工具¶
示例中的 findOwnedApplication 必须在 SQL 或 Service 中同时按申请编号和当前用户查询:
不能先按申请编号查询完整记录,再依赖模型判断“这是不是当前用户的”。
3. 工具注册表¶
注册表本身就是允许列表。模型即使返回 delete_all_users,后端也找不到并拒绝执行。
五、完成 Tool Calling 循环¶
1. 一轮调用¶
用户问题:
模型可能返回工具调用意图:
后端执行工具后得到:
再将工具结果交给模型组织回答:
2. 模型调用结果需要明确区分¶
具体模型平台对工具定义、调用结果和工具消息的字段不同,应根据所选平台官方文档实现适配层。
3. 受控循环伪代码¶
4. 为什么必须设置上限¶
模型可能:
- 重复调用同一个工具;
- 在两个工具之间循环;
- 参数错误后不断重试;
- 因工具结果不完整而继续探索;
- 遭遇恶意内容诱导调用更多工具。
至少限制:
- 最大步骤数;
- 单个工具超时;
- 单轮工具调用数量;
- 重复调用次数;
- 总执行时间;
- 总模型用量;
- 单次返回记录数量。
能一轮完成,就不要设计成多步智能体
“查询一个申请状态”只需要一次工具调用。多步循环不是高级的证明,稳定、可解释和范围清楚更重要。
六、写操作必须增加确认与幂等¶
只读工具稳定后,才考虑低风险写操作。
1. 两阶段执行¶
例如模型建议取消预约:
模型不能替用户点击“确认取消”。
2. 确认内容不能只显示模型文字¶
操作摘要应由后端根据最新数据库记录生成,不能完全相信模型提供的名称、金额、时间和对象。
3. 幂等键¶
网络重试或重复点击可能让同一个写工具执行多次。可以为每次确认生成幂等键:
后端记录该键是否已经成功执行。同一键再次提交时返回第一次结果,不重复修改数据。
4. 写工具最低要求¶
- 用户明确确认;
- 后端重新检查权限和业务状态;
- 参数使用稳定业务 ID;
- 防止重复执行;
- 支持撤销或人工补救(如业务允许);
- 完整审计;
- 明确失败结果;
- 不允许模型绕过正常审批流程。
七、认识 MCP 的架构¶
MCP 官方文档将参与者分为 Host、Client 和 Server。
1. Host¶
Host 是承载 AI 体验的应用,负责:
- 管理一个或多个 MCP Client;
- 控制连接权限和生命周期;
- 汇总可用工具和上下文;
- 与模型交互;
- 执行用户授权和安全策略;
- 向用户展示确认和调用记录。
2. Client¶
每个 MCP Client 维护与一个 MCP Server 的连接,负责:
- 初始化连接;
- 协议版本协商;
- 能力发现;
- 请求和响应路由;
- 通知、进度和错误处理;
- 隔离不同 Server 的连接。
3. Server¶
MCP Server 是提供特定能力的程序,可以在本机运行,也可以通过网络提供服务。它可以暴露:
- Tools;
- Resources;
- Prompts;
- 以及协议支持的其他能力。
4. 数据层与传输层¶
MCP 数据层使用 JSON-RPC 2.0 表达初始化、能力发现和调用消息。标准传输包括:
stdio:Host 启动本地 Server 子进程,通过标准输入输出通信;- Streamable HTTP:通过 HTTP 连接远程 Server,并支持流式能力。
协议版本和能力需要在初始化阶段协商。教材不把某个日期版本写死在代码中,实际实现应查看 MCP 官方版本说明和所选 SDK 支持的版本。
八、区分 MCP 的 Tools、Resources 与 Prompts¶
1. Tools:执行查询、计算或操作¶
常用协议方法:
工具通常有名称、说明和 inputSchema。AI 应用发现工具后,可以在合适的交互中让模型提出调用。
2. Resources:提供可读取的上下文¶
Resource 更像可读取资料,而不是要执行的动作。它通常包含 URI、名称、类型和内容。
常用协议方法:
3. Prompts:可复用的交互模板¶
Prompt 可以定义参数和消息模板,帮助用户主动选择一个标准工作流。
常用协议方法:
4. 怎样选择¶
| 需求 | MCP 能力 |
|---|---|
| 查询当前用户申请状态 | Tool |
| 读取公开办事指南原文 | Resource |
| 提供“准备申请材料”的固定问法 | Prompt |
| 修改正式申请状态 | Tool,但需要严格确认与权限 |
Resource 不自动等于 RAG
MCP Resource 提供标准化读取入口。Host 可以直接选择内容、使用关键词搜索、使用 RAG 检索,或让用户手动选择。MCP 不规定 AI 应用必须怎样使用 Resource。
九、理解 MCP 工具发现与调用¶
以下消息用于理解协议,不要求学生手写完整 MCP 实现。实际开发优先使用与项目语言匹配、版本兼容的官方或成熟 SDK。
1. 发现工具¶
请求:
响应示意:
2. 调用工具¶
Server 返回工具结果后,Host 决定是否把结果交给模型、怎样展示给用户以及是否继续下一步。
3. MCP 不替代业务 API¶
推荐分层:
REST 接口和 MCP Tool 复用同一个业务 Service、权限规则和数据访问,不要复制第二套业务实现。
十、什么时候值得使用 MCP¶
1. 适合¶
- 同一套工具需要被多个 AI 应用使用;
- 希望工具可以被标准方式发现;
- 需要同时暴露 Tools、Resources 和 Prompts;
- 已有 AI Host 支持连接 MCP Server;
- 团队能够维护协议版本、鉴权和部署;
- 需要将业务能力与具体模型供应商解耦。
2. 暂时不需要¶
- 只有当前项目内部一个 AI 页面使用;
- 一个普通 Java 接口和 Service 已经足够;
- 团队尚未完成工具权限、校验和审计;
- 只是为了在答辩中出现“MCP”名词;
- 没有可连接的 Host 或真实复用场景;
- 课程时间不足以完成协议和安全测试。
3. 推荐学习路线¶
协议和 SDK 会演进。应从 MCP 官方文档选择与当前技术栈匹配的指南,而不是照抄过期博客中的依赖和传输配置。
十一、设计一个最小智能体¶
1. 受控任务示例¶
目标:
允许步骤:
这比“帮我处理全部申请”更明确、更安全。
2. 智能体状态¶
实际系统还应记录:
- 当前用户;
- 请求 ID;
- 已消耗时间和模型用量;
- 工具结果摘要;
- 待用户确认的操作;
- 停止原因;
- 错误和恢复状态。
3. 停止条件¶
- 模型生成最终回答;
- 达到最大步骤数;
- 达到总超时;
- 达到费用或 Token 限制;
- 工具连续失败;
- 重复相同调用;
- 用户主动停止;
- 即将执行需要确认的操作;
- 发现权限不足或高风险请求。
4. 不要隐藏智能体过程¶
页面不必展示模型的内部推理,但应展示可验证的操作:
如果需要写操作,应展示即将执行的真实业务摘要并等待确认。
十二、权限、确认与审计¶
1. 每次工具执行都重新授权¶
不能因为模型已经获得一次工具列表,就默认后续所有调用都被允许。
2. 权限按最小范围授予¶
| 用户 | 可以调用 | 不可以调用 |
|---|---|---|
| 普通用户 | 查询自己的申请 | 查询其他用户申请 |
| 教师 | 查询自己负责的申请 | 修改系统权限 |
| 管理员 | 按职责处理业务 | 获取数据库密码 |
管理员也不应自动拥有与当前任务无关的全部工具。
3. 审计日志¶
建议记录:
不要记录:
- API Key;
- 登录 Token;
- 密码;
- 完整私有文档;
- 无关个人信息;
- 不受控的完整模型上下文。
4. 审计不是普通调试日志¶
审计记录需要回答:
十三、防范提示注入与恶意工具¶
1. 用户输入中的提示注入¶
模型可能提出错误调用,但后端允许列表和权限检查必须拒绝。
2. 工具结果中的提示注入¶
外部网页、文档或工具结果可能包含:
工具结果是数据,不是新的系统指令。Host 应标记来源、限制返回内容,并避免将不可信内容变成高权限操作。
3. 工具描述也需要信任¶
连接未知 MCP Server 时,Server 提供的工具名称和描述也可能具有误导性。不要看到“只读查询”就默认它真的只读。
连接第三方 MCP Server 前应确认:
- 发布者和来源;
- Server 实际运行位置;
- 需要哪些凭据;
- 能访问哪些文件、数据库和网络;
- 工具是否会产生外部写操作;
- 是否有代码和安全审查;
- 如何撤销权限;
- 是否保留调用日志。
4. 不提供通用执行工具¶
高风险工具包括:
这些工具把权限边界交给模型参数。课程项目应提供窄能力工具,例如:
十四、测试 Tool Calling、MCP 与智能体¶
1. Tool Calling 最低测试集¶
| 编号 | 场景 | 预期 |
|---|---|---|
| TOOL-01 | 正常查询本人申请 | 返回最少必要状态 |
| TOOL-02 | 缺少参数 | 拒绝调用,提示补充 |
| TOOL-03 | 参数类型错误 | Schema 或后端校验失败 |
| TOOL-04 | 调用未知工具 | 注册表拒绝 |
| TOOL-05 | 查询他人申请 | 返回无权查看,不泄露记录是否存在 |
| TOOL-06 | 模型伪造 userId |
后端忽略,使用登录身份 |
| TOOL-07 | 工具超时 | 停止等待并返回友好错误 |
| TOOL-08 | 重复调用 | 达到限制后停止 |
| TOOL-09 | 提示注入要求管理员操作 | 后端权限拒绝 |
| TOOL-10 | 模型服务失败 | 不执行未确认工具 |
2. 写工具专项测试¶
- 未确认时不能执行;
- 用户取消确认后不能执行;
- 确认前后状态变化时重新校验;
- 同一幂等键重复提交只执行一次;
- 执行失败不会显示成功;
- 审计记录能够找到操作者、对象和结果;
- 用户只能操作自己有权处理的数据。
3. MCP 连接测试¶
- 初始化和版本协商;
- Server 能力发现;
tools/list返回正确 Schema;tools/call正常和错误参数;- Server 断开和重连;
stdioServer 不向标准输出写调试文字破坏协议;- Streamable HTTP 的鉴权和超时;
- 未授权 Client 无法调用;
- 不同 Client 会话不会混淆用户身份。
4. 智能体循环测试¶
- 一步完成;
- 正常多步完成;
- 连续工具失败;
- 重复同一工具和参数;
- 达到最大步骤;
- 达到总超时;
- 用户中途停止;
- 需要确认时暂停;
- 工具结果包含恶意指令;
- 模型提出超出允许范围的操作。
5. 使用模拟模型和模拟工具¶
自动化测试应固定模型行为:
还可以模拟:
这样才能稳定验证调度循环,而不是依赖真实模型每次作出相同决定。
十五、效果与风险评估¶
| 维度 | 检查内容 |
|---|---|
| 任务完成 | 是否正确满足用户目标 |
| 工具选择 | 是否选择了必要且正确的工具 |
| 参数正确 | 是否使用有效业务 ID 和参数 |
| 权限安全 | 是否出现越权调用 |
| 步骤效率 | 是否存在不必要或重复调用 |
| 用户控制 | 写操作是否明确确认 |
| 可审计 | 是否能还原实际调用过程 |
| 可降级 | 模型或工具失败时是否可继续 |
| 成本 | 模型轮次和工具调用是否受限 |
评测记录示例:
智能体“最终给出了回答”并不代表成功。如果中间调用了错误工具、访问了无权数据或产生了无法解释的操作,应判定失败。
十六、🤖 让 AI 帮你设计工具,但必须核对¶
人工必须核对:
- 工具是否真的需要模型选择;
- 工具是否比普通业务接口权限更大;
- 参数是否允许越过数据归属;
- 输出是否包含不必要的敏感字段;
- 未知工具和越权调用是否被后端拒绝;
- 工具描述是否与真实行为一致;
- 循环是否有明确停止条件;
- 写操作是否经过真实用户确认。
十七、常见问题与修正方法¶
| 常见问题 | 风险 | 修正方法 |
|---|---|---|
| 认为模型会执行函数 | 无法理解安全责任 | 模型只返回意图,应用执行 |
| 将 Tool Calling、MCP、智能体混为一谈 | 架构和范围失控 | 分别说明调用、连接协议和运行循环 |
工具接受 userId 和 role |
模型可伪造身份 | 从后端登录上下文读取 |
| 暴露万能 SQL 或 Shell 工具 | 权限几乎无限 | 提供范围窄的业务工具 |
| 只在提示词中要求不越权 | 无法形成安全边界 | 每次执行由后端重新授权 |
| 工具返回完整 Entity | 泄露敏感字段 | 定义最小结果 DTO |
| 写操作无需确认 | 误操作直接生效 | 两阶段确认并重新校验 |
| 重试写操作没有幂等 | 重复提交或扣减 | 使用服务端幂等键 |
| 智能体没有步骤上限 | 无限循环、成本失控 | 限制步骤、时间、调用和用量 |
| 连接未知 MCP Server | 工具或数据来源不可信 | 审查来源、权限和真实行为 |
| 为一个内部工具强行使用 MCP | 增加复杂度但没有复用价值 | 先用普通 Java 工具注册表 |
| 只展示最终回答 | 无法审计调用过程 | 记录实际工具、对象、确认和结果 |
十八、提交前自查¶
概念与范围¶
- 能区分 Tool Calling、MCP 和智能体;
- 第一次实现只选择一个范围小的只读工具;
- 工具名称、说明和输入 Schema 清晰;
- 没有提供任意 SQL、Shell、URL 或文件访问;
- 已说明是否真的需要 MCP。
权限与执行¶
- 模型只提出调用,后端实际执行;
- 工具通过后端允许列表注册;
- 当前用户身份来自 JWT 或 Session;
- 不信任模型传入的
userId、role和权限; - 每次调用重新检查工具权限和数据归属;
- 工具只返回完成任务所需的最少字段;
- 写操作(如有)经过确认、重新校验和幂等处理。
智能体与安全¶
- 设置最大步骤、总超时和重复调用限制;
- 工具失败不会导致无限重试;
- 用户可以停止任务;
- 工具结果中的指令不会自动提升权限;
- 第三方 MCP Server 的来源和权限已经核对;
- 模型或工具不可用时有降级方式。
测试与审计¶
- 已测试正常、无效参数、未知工具和越权;
- 已测试超时、重复调用和提示注入;
- 自动化测试使用模拟模型和模拟工具;
- 审计能够回答谁调用了什么、操作了哪个对象和结果如何;
- 日志不包含密钥、Token 和无关隐私;
- 演示包含一次正常调用和一次被拒绝的危险调用。
十九、延伸阅读¶
优先阅读官方文档
MCP 协议和各语言 SDK 仍在演进。实现时应确认当前规范版本、SDK 版本和 Host 支持情况,避免照抄过期教程。
本节小结¶
Tool Calling、MCP 和智能体拓展了模型能够接触的数据与操作,也要求项目建立更严格的控制:
模型提出调用 → 后端允许列表 → 参数与权限校验 → 必要时用户确认 → 执行最小业务工具 → 返回最少结果 → 限制循环 → 完整审计
完成本节后,你应能够实现一个安全的只读工具,并解释 MCP 怎样标准化连接、智能体怎样组织多步运行。下一节将从整个 AI 扩展功能出发,完成安全、成本、降级、测试和演示交付。