Skip to main content
工具是模型上下文协议(MCP)中的一个强大原语,它使服务器能够向客户端公开可执行的功能。通过工具,LLM 可以与外部系统交互、执行计算并在现实世界中采取行动。
工具被设计为模型控制的,这意味着工具是从服务器向客户端公开的,目的是让 AI 模型能够自动调用它们(在人工监督下批准)。

概述

MCP 中的工具允许服务器公开可执行的函数,这些函数可以被客户端调用并被 LLM 用来执行操作。工具的关键方面包括:
  • 发现:客户端可以通过 tools/list 端点列出可用工具
  • 调用:工具通过 tools/call 端点调用,服务器执行请求的操作并返回结果
  • 灵活性:工具可以从简单的计算到复杂的 API 交互
资源一样,工具由唯一的名称标识,并可以包含描述来指导其使用。但是,与资源不同,工具代表可以修改状态或与外部系统交互的动态操作。

工具定义结构

每个工具都使用以下结构定义:

实现工具

这是在 MCP 服务器中实现基本工具的示例:

工具模式示例

以下是服务器可以提供的一些工具类型示例:

系统操作

与本地系统交互的工具:

API 集成

封装外部 API 的工具:

数据处理

转换或分析数据的工具:

最佳实践

在实现工具时:
  1. 提供清晰、描述性的名称和描述
  2. 使用详细的 JSON Schema 定义参数
  3. 在工具描述中包含示例,以演示模型应如何使用它们
  4. 实现适当的错误处理和验证
  5. 对长时间操作使用进度报告
  6. 保持工具操作的重点和原子性
  7. 记录预期的返回值结构
  8. 实现适当的超时
  9. 考虑资源密集型操作的速率限制
  10. 记录工具使用情况以进行调试和监控

安全考虑

在公开工具时:

输入验证

  • 根据 schema 验证所有参数
  • 清理文件路径和系统命令
  • 验证 URL 和外部标识符
  • 检查参数大小和范围
  • 防止命令注入

访问控制

  • 在需要时实现身份验证
  • 使用适当的授权检查
  • 审计工具使用情况
  • 限制请求速率
  • 监控滥用情况

错误处理

  • 不要向客户端暴露内部错误
  • 记录安全相关错误
  • 适当处理超时
  • 在错误后清理资源
  • 验证返回值

工具发现和更新

MCP 支持动态工具发现:
  1. 客户端可以随时列出可用工具
  2. 服务器可以使用 notifications/tools/list_changed 通知客户端工具变更
  3. 工具可以在运行时添加或删除
  4. 工具定义可以更新(但应谨慎进行)

错误处理

工具错误应在结果对象中报告,而不是作为 MCP 协议级错误。这允许 LLM 看到并可能处理错误。当工具遇到错误时:
  1. 在结果中将 isError 设置为 true
  2. content 数组中包含错误详情
以下是工具正确错误处理的示例:
这种方法允许 LLM 看到发生了错误,并可能采取纠正措施或请求人工干预。

测试工具

MCP 工具的全面测试策略应涵盖:
  • 功能测试:验证工具使用有效输入时正确执行,并适当处理无效输入
  • 集成测试:使用真实和模拟的依赖项测试工具与外部系统的交互
  • 安全测试:验证身份验证、授权、输入清理和速率限制
  • 性能测试:检查负载下的行为、超时处理和资源清理
  • 错误处理:确保工具通过 MCP 协议正确报告错误并清理资源