用户交互模型
MCP 中的工具被设计为模型控制,这意味着语言模型可以基于其对上下文和用户提示的理解, 自动发现并调用工具。 不过,实现可以自由地通过任何适合自身需求的界面模式公开工具; 协议本身并不强制规定任何特定的用户交互模型。能力
支持工具的服务器 MUST 声明tools 能力:
listChanged 表示服务器是否会在可用工具列表变化时发出通知。
协议消息
列出工具
为了发现可用工具,客户端会发送tools/list 请求。此操作支持分页。
请求:
调用工具
为了调用工具,客户端会发送tools/call 请求:
请求:
列表变化通知
当可用工具列表变化时,已声明listChanged 能力的服务器 SHOULD 发送通知:
消息流
数据类型
Tool
工具定义包括:name:工具的唯一标识符title:用于显示的可选人类可读工具名称。description:对功能的人类可读描述icons:用于在用户界面中显示的可选图标数组inputSchema:定义预期参数的 JSON Schema- 遵循 JSON Schema 使用指南
- 如果不存在
$schema字段,则默认为 2020-12 - MUST 是有效的 JSON Schema 对象(不是
null) - 对于没有参数的工具,请使用以下有效方式之一:
{ "type": "object", "additionalProperties": false }- 推荐:明确只接受空对象{ "type": "object" }- 接受任何对象(包括带有属性的对象)
outputSchema:定义预期输出结构的可选 JSON Schema- 遵循 JSON Schema 使用指南
- 如果不存在
$schema字段,则默认为 2020-12
annotations:描述工具行为的可选属性execution:描述执行相关属性的可选对象taskSupport:表示此工具是否支持任务增强执行。取值为"forbidden"(默认)、"optional"或"required"
工具名称
- 工具名称长度 SHOULD 在 1 到 128 个字符之间(含边界)。
- 工具名称 SHOULD 被视为区分大小写。
- SHOULD 仅允许以下字符:ASCII 大写和小写字母(A-Z、a-z)、数字(0-9)、下划线(_)、连字符(-)和点(.)
- 工具名称 SHOULD NOT 包含空格、逗号或其他特殊字符。
- 工具名称 SHOULD 在服务器内唯一。
- 有效工具名称示例:
- getUser
- DATA_EXPORT_v2
- admin.tools.list
Tool Result
工具结果可以包含结构化内容或非结构化内容。 非结构化内容会在结果的content 字段中返回,并且可以包含多个不同类型的内容项:
所有内容类型(文本、图像、音频、资源链接和嵌入式资源)都支持可选的
annotations,用于提供受众、优先级和修改时间等元数据。
这与资源和提示使用的 annotation 格式相同。
文本内容
图像内容
音频内容
资源链接
工具 MAY 返回指向资源的链接,以提供额外上下文或数据。 在这种情况下,工具会返回一个可由客户端订阅或获取的 URI:工具返回的资源链接不保证会出现在
resources/list 请求的结果中。嵌入式资源
资源 MAY 使用合适的 URI 方案 以内嵌方式提供额外上下文或数据。 使用嵌入式资源的服务器 SHOULD 实现resources 能力:
Structured Content
结构化内容会作为 JSON 对象在结果的structuredContent 字段中返回。
为了向后兼容,返回结构化内容的工具 SHOULD 同时在 TextContent 块中返回序列化后的 JSON。
输出 Schema
工具也可以提供输出 schema,用于验证结构化结果。 如果提供了输出 schema:- 服务器 MUST 提供符合此 schema 的结构化结果。
- 客户端 SHOULD 根据此 schema 验证结构化结果。
- 启用对响应的严格 schema 验证
- 提供类型信息,以便更好地与编程语言集成
- 指导客户端和 LLM 正确解析和使用返回的数据
- 支持更好的文档和开发者体验
Schema 示例
使用默认 2020-12 schema 的工具:
使用显式 draft-07 schema 的工具:
无参数工具:
错误处理
工具使用两种错误报告机制:-
协议错误:用于以下问题的标准 JSON-RPC 错误:
- 未知工具
- 格式错误的请求(不满足 CallToolRequest schema 的请求)
- 服务器错误
-
工具执行错误:在工具结果中以
isError: true报告:- API 失败
- 输入验证错误(例如日期格式错误、值超出范围)
- 业务逻辑错误
安全注意事项
-
服务器 MUST:
- 验证所有工具输入
- 实现适当的访问控制
- 对工具调用进行速率限制
- 清理工具输出
-
客户端 SHOULD:
- 对敏感操作提示用户确认
- 在调用服务器前向用户显示工具输入,以避免恶意或意外的数据外泄
- 在传递给 LLM 前验证工具结果
- 为工具调用实现超时
- 出于审计目的记录工具使用情况