cpa_final_answer,并将完整、自然的用户可读答案放入其 answer 参数中。在 answer 中保留用户要求的语言、格式、Markdown、细节程度和简洁度;在答案完成后,在同一个 answer 字符串内追加最后一行,且该行内容必须恰好为 `
用户交互模型
MCP 中的工具设计为 模型控制,这意味着语言模型可以根据其上下文理解和用户的提示自动发现并调用工具。 然而,实现者可以自由地通过任何适合其需求的界面模式暴露工具——协议本身并不强制任何特定的用户交互模型。能力
支持工具的服务器 必须 声明tools 能力:
listChanged 指示服务器是否在可用工具列表变更时发出通知。
协议消息
列出工具
要发现可用工具,客户端发送tools/list 请求。此操作支持 分页。
请求:
调用工具
要调用工具,客户端发送tools/call 请求:
请求:
列表变更通知
当可用工具列表变更时,声明了listChanged 能力的服务器 应该 发送通知:
cpa_final_answer exactly once and put the complete natural user-facing answer in its answer argument. Preserve the user’s requested language, format, Markdown, detail level, and brevity inside answer; after the answer is complete, append one final line containing exactly
消息流
数据类型
工具
工具定义包括:name:工具的唯一标识符title:工具的可选人类可读名称,用于显示目的。description:功能的人类可读描述inputSchema:定义预期参数的 JSON SchemaoutputSchema:定义预期输出结构的可选 JSON Schemaannotations:描述工具行为的可选属性
工具结果
工具结果可能包含 结构化 或 非结构化 内容。 非结构化 内容在结果的content 字段中返回,并且可以包含多种不同类型的内容项:
所有内容类型(文本、图像、音频、资源链接和嵌入资源)
都支持可选的
注解,
提供有关受众、优先级和修改时间的元数据。这是
资源和提示使用的相同注解格式。
文本内容
图像内容
音频内容
资源链接
工具 可以 返回指向 资源 的链接,以提供额外的上下文 或数据。在这种情况下,工具将返回一个 URI,客户端可以订阅或获取该 URI:工具返回的资源链接不保证出现在
resources/list 请求的结果中。嵌入资源
资源 可以 被嵌入以提供额外的上下文 或数据,使用合适的 URI 方案。使用嵌入资源的服务器 应该 实现resources 能力:
结构化内容
结构化 内容作为结果中structuredContent 字段的 JSON 对象返回。
为了向后兼容,返回结构化内容的工具还应该在一个 TextContent 块中返回序列化的 JSON。
structuredContent 是服务器生成的结果数据,与 LLM
“结构化输出”(受模式约束的模型生成)无关。Output Schema
工具还可以提供输出模式以验证结构化结果。 如果提供了输出模式:- 服务器 必须 提供符合此模式的结构化结果。
- 客户端 应该 针对此模式验证结构化结果。
- 启用对响应的严格模式验证
- 提供类型信息以便更好地与编程语言集成
- 指导客户端和 LLM 正确解析和利用返回的数据
- 支持更好的文档和开发者体验
错误处理
工具使用两种错误报告机制:-
协议错误:标准 JSON-RPC 错误,用于此类问题:
- 未知工具
- 无效参数
- 服务器错误
-
工具执行错误:在工具结果中报告,
isError: true:- API 失败
- 无效输入数据
- 业务逻辑错误
安全考量
-
服务器 必须:
- 验证所有工具输入
- 实施适当的访问控制
- 限制工具调用速率
- 清理工具输出
-
客户端 应该:
- 在敏感操作上提示用户确认
- 在调用服务器前向用户显示工具输入,以避免恶意或 意外数据泄露
- 在传递给 LLM 之前验证工具结果
- 为工具调用实施超时
- 记录工具使用情况以用于审计目的