跳到正文
Elaine Blog
返回

MCP 不只有工具:Resources、Prompts 与多轮请求

更新于:
Tool Calling 与 MCP

同一售后系统中,有可以调用的订单查询,有可以读取的政策文档,还有可复用的售后解释模板。它们都能帮助模型,却不必全部表达成函数调用。

MCP 将这些能力分成 Tools、Resources 与 Prompts。分类帮助 Host 组织交互,但不是权限机制:读取资源、选择提示模板和调用工具都需要应用自己的范围控制。

Tool 适合表达一次能力调用

get_order(order_id) 有明确参数和结果,可以根据问题由模型提出调用。它是只读工具;create_refund_draft 是写入草稿的工具。是否有副作用与是否属于 Tool 无关。

工具定义可以包含 inputSchema、outputSchema 与行为提示,Host 获得清单后仍需决定哪些工具允许交给本次模型。SDK 类型检查只能帮助处理契约,实际订单归属要由服务校验。

工具结果可包含可读内容和结构化内容。线协议的 structuredContent 与 Python SDK 的 structured_content 是不同表示层的字段命名,示例会分别使用,避免把 SDK 属性直接当作 JSON 字段。

Resource 适合表达可定位的资料

政策可以用 policy://refund 标识,也可以用模板 policy://refund/{version} 暴露具体版本。URI 是资源身份,并不要求它一定是可直接用浏览器打开的 URL。

Host 可以让用户选资料,也可以按任务自动读取。Resources 典型上由应用组织,但协议并不强制唯一界面方式;模型参与选择也不把资源转换成高优先级指令。Resources 规范

读取当前政策与读取固定版本用途不同。固定版本便于引用与追溯,当前入口便于获取更新;如果答案引用旧条款,应用必须按订单适用规则判断,而不是单纯总取最新。

资源内容可以是文本,也可以是带类型信息的二进制表示。大文件应考虑按范围读取或返回受控引用,不能因协议能传就把全部内容塞进模型。

Prompt 适合提供可复用的交互模板

例如 explain_refund(order_id) 返回一组建议消息,帮助 Host 组织售后解释。它可以接收参数,但返回的提示不代表已经查询订单或获得提交权限。

用户通过菜单选择模板是一种典型交互;Host 可以采用其他形式。模板来自外部 Server 时仍需审阅,不能因为原语叫 Prompt 就自动将其内容放到最高指令位置。

本系列 Server 同时暴露订单工具、政策资源和解释模板。它们共享业务背景,展示不同原语,而不是复制三套订单查询逻辑。

错误属于哪一层

HTTP 连接失败、JSON-RPC 消息错误、工具执行错误和业务拒绝是不同层次。请求被正确解析,不代表工具一定成功;工具执行成功,也可能返回“该订单不符合条件”的合法业务状态。

在本文采用的 SDK 中,可预期工具失败使用 ToolError 表达,让 Client 收到 is_error 标记;未知异常由 SDK 处理,避免把敏感堆栈原样送出。不要仅返回一段“错误”文本却让调用方看到正常成功标记。SDK 错误处理

Host 回填模型时也要保留错误语义。若把 is_error=true 的内容当普通成功结果,模型可能继续基于不存在的订单生成结论。是否允许修正一次参数,由运行时控制。

列表和资源为什么需要分页与缓存

几百个工具不应一次全塞进 Prompt。Client 按分页游标读取清单,Host 再根据任务筛选;游标是协议状态标识,不应让模型猜下一页字符串。

目录缓存可以减少重复发现,但必须考虑主体范围与工具版本。用户权限变化后,旧目录可能仍包含已撤销能力;执行时重新授权不可省略。稳定排序也有助于避免相同工具集合在每轮产生无谓变化。

资源内容缓存还要考虑政策更新。Host 应理解 TTL 与缓存范围,不能把某用户私有结果放到全局共享缓存。具体字段依所用协议和 SDK,配置不等于正确失效已经实现。

一次请求缺信息时怎样往返

工具可能发现缺少用户选择的取件时段。2026-07-28 的多轮请求机制允许返回 input_required,Client 获取所需输入后再次发送原请求,并附带 inputResponses,必要时带回 requestState。SDK 多轮请求说明

这个 requestState 是续办关联数据,不是审批凭证。Server 要检查它与原请求、时效和主体的绑定。Client 也要限制补充轮数,避免工具反复索要信息。

如果后续请求会重跑处理函数,首次返回缺信息之前不要已经提交退款。补齐参数、获得用户确认和执行副作用应按业务顺序组织。协议提供往返能力,不负责替你解决重复业务操作。

长任务、进度和取消怎样理解

一个任务可以先返回可查询的业务 handle,再继续执行。使用 Tasks 等扩展时,双方需要明确支持对应扩展,不能把未识别字段当成已经得到对端保证。

进度 80% 是服务报告的状态信息,不意味着剩余时间一定为 20%。取消请求是停止意图,仍需确认执行端是否终止以及已有副作用如何处理。

Roots、Sampling、Logging 与旧传输等历史能力需要按版本理解;当前系列把弃用功能放在迁移说明,不把“弃用”写成“已经完全不可调用”。当前版本变更与扩展迁移可参阅 发布说明

MCP Apps 等扩展还可以让 Host 呈现与工具相关的交互界面。界面展示、用户输入和工具执行授权仍是不同环节:显示一个确认按钮,不代表 Server 可以跳过后台授权,也不能假设每个 Host 都支持相同扩展。

对历史能力,理解原用途仍然有价值:Roots 用来表达客户端资源根,Sampling 让服务侧请求客户端协助模型生成,Logging 传递协议日志。迁移时应按当前规范选择显式资源或工具参数、直接模型接入,以及 stderr 或运行观测等适合方案;不能仅将方法改名就认为语义等价。

掌握这些原语之后,应用就能选择“读资料”“获取模板”或“执行能力”,而不是把所有事情都变成一个含糊的大工具。

继续阅读

上一篇:为什么需要 MCP:从本地工具到跨应用能力连接

下一篇:MCP 怎样连接与授权:stdio、HTTP 和凭据的完整路径

下载文件、依赖与运行边界见配套指南下载


分享这篇文章:

上一篇
为什么需要 MCP:从本地工具到跨应用能力连接
下一篇
MCP 怎样连接与授权:stdio、HTTP 和凭据的完整路径