工具是模型上下文协议(MCP)中的一个强大原语,允许服务器向客户端暴露可执行功能。通过工具,大型语言模型(LLM)可以与外部系统交互、执行计算并在现实世界中采取行动。
工具设计为模型控制,意味着工具从服务器暴露给客户端,目的是让 AI 模型能够自动调用它们(需有人在回路中批准)。
MCP 中的工具允许服务器暴露可由客户端调用并由 LLM 用于执行操作的可执行函数。工具的关键方面包括:
tools/list
端点列出可用工具tools/call
端点调用工具,服务器执行请求的操作并返回结果与资源类似,工具通过唯一名称标识,并可包含描述以指导使用。然而,与资源不同,工具表示可以修改状态或与外部系统交互的动态操作。
每个工具的定义结构如下:
以下是在 MCP 服务器中实现基本工具的示例:
以下是服务器可以提供的工具类型示例:
与本地系统交互的工具:
封装外部 API 的工具:
转换或分析数据的工具:
实现工具时:
暴露工具时:
MCP 支持动态工具发现:
notifications/tools/list_changed
通知客户端工具变更工具错误应在结果对象中报告,而不是作为 MCP 协议级别的错误。这允许 LLM 查看并可能处理错误。工具遇到错误时:
isError
设置为 true
content
数组中包含错误详情以下是工具正确错误处理的示例:
这种方式允许 LLM 看到错误发生,并可能采取纠正措施或请求人工干预。
工具注解为工具的行为提供了额外的元数据,帮助客户端了解如何呈现和管理工具。这些注解是描述工具性质和影响的提示,但不应依赖其进行安全决策。
工具注解有以下几个关键用途:
MCP 规范为工具定义了以下注解:
注解 | 类型 | 默认值 | 描述 |
---|---|---|---|
title |
string | - | 工具的可读标题,适用于 UI 显示 |
readOnlyHint |
boolean | false | 如果为 true,表示工具不修改其环境 |
destructiveHint |
boolean | true | 如果为 true,工具可能执行破坏性更新(仅在 readOnlyHint 为 false 时有意义) |
idempotentHint |
boolean | false | 如果为 true,重复调用相同参数无额外效果(仅在 readOnlyHint 为 false 时有意义) |
openWorldHint |
boolean | true | 如果为 true,工具可能与外部实体交互 |
以下是为不同场景定义带注解的工具的示例:
MCP 工具的全面测试策略应涵盖: