工具设计为模型控制,意味着服务器向客户端暴露工具的目的是让AI模型能够自动调用它们(在人工监督下授予批准)。
概述
MCP中的工具允许服务器暴露可执行函数,客户端可以调用这些函数,LLM可以使用它们来执行操作。工具的关键方面包括:- 发现:客户端可以通过
tools/list端点列出可用工具 - 调用:使用
tools/call端点调用工具,服务器执行请求的操作并返回结果 - 灵活性:工具可以从简单的计算到复杂的API交互
工具定义结构
每个工具的定义结构如下:实现工具
以下是在MCP服务器中实现基本工具的示例:- TypeScript
- Python
工具模式示例
以下是一些服务器可以提供的工具类型示例:系统操作
与本地系统交互的工具:API集成
封装外部API的工具:数据处理
转换或分析数据的工具:最佳实践
在实现工具时:- 提供清晰、描述性的名称和描述
- 使用详细的JSON Schema定义参数
- 在工具描述中包含示例,以演示模型应如何使用它们
- 实现适当的错误处理和验证
- 对长时间操作使用进度报告
- 保持工具操作专注和原子化
- 记录预期的返回值结构
- 实现适当的超时机制
- 对资源密集型操作考虑速率限制
- 记录工具使用情况以便调试和监控
安全考虑
在暴露工具时:输入验证
- 根据模式验证所有参数
- 清理文件路径和系统命令
- 验证URL和外部标识符
- 检查参数大小和范围
- 防止命令注入
访问控制
- 在需要时实施身份验证
- 使用适当的授权检查
- 审计工具使用情况
- 对请求进行速率限制
- 监控滥用行为
错误处理
- 不要向客户端暴露内部错误
- 记录与安全相关的错误
- 适当处理超时
- 在错误后清理资源
- 验证返回值
工具发现和更新
MCP支持动态工具发现:- 客户端可以随时列出可用工具
- 服务器可以使用
notifications/tools/list_changed通知客户端工具更改 - 可以在运行时添加或删除工具
- 工具定义可以更新(尽管应谨慎进行)
错误处理
工具错误应在结果对象中报告,而不是作为MCP协议级别的错误。这使得LLM能够看到并可能处理错误。当工具遇到错误时:- 在结果中将
isError设置为true - 在
content数组中包含错误详细信息
- TypeScript
- Python
测试工具
MCP工具的全面测试策略应涵盖:- 功能测试:验证工具在有效输入下正确执行,并正确处理无效输入
- 集成测试:使用真实和模拟的依赖项测试工具与外部系统的交互
- 安全测试:验证身份验证、授权、输入清理和速率限制
- 性能测试:检查负载下的行为、超时处理和资源清理
- 错误处理:确保工具通过MCP协议正确报告错误并清理资源