Progressive Tool Discovery

Nikola Balic (@nibzard)· established

问题

当Agent可访问大型工具目录(涵盖数十乃至数百种可用工具)时,预先加载所有工具定义会占用过多的context window空间。在特定工作流中,大多数工具都不会被用到,这种预加载方式不仅造成资源浪费,还会限制实际任务执行时可调用的context空间。

方案

通过类文件系统层级结构呈现工具,让Agent能够通过探索该结构按需发现功能。实现search_tools功能,允许Agent请求不同详细程度的信息:

  1. 仅名称:用于初始浏览的极简上下文
  2. 名称+描述:足以理解工具用途的信息
  3. 包含Schema的完整定义:仅在需要时提供完整的API细节

工具按层级组织(例如servers/google-drive/getDocument.tsservers/slack/sendMessage.ts),因此Agent可以:

  • 列出./servers/目录以查看可用集成
  • 进入特定服务目录查找相关工具
  • 仅为打算使用的工具加载完整定义
# Agent 工作流
1. list_directory("./servers/")
   → 返回:["google-drive/", "slack/", "github/", ...]

2. search_tools(pattern="google-drive/*", detail_level="name+description")
   → 返回:Google Drive 工具的简要说明

3. get_tool_definition("servers/google-drive/getDocument")
   → 返回:包含参数、类型、示例的完整JSON Schema

如何使用

最佳适用场景:

  • 拥有20款及以上可用工具或集成能力的系统
  • 模型上下文协议(MCP)服务器实现
  • 代理可从大量功能中选择的插件架构

实现注意事项:

  • 按集成来源、业务领域或功能类型,将工具组织为清晰的层级结构
  • 在每个层级提供具有实际意义的名称与描述
  • 支持工具搜索的模式匹配(通配符或正则表达式)
  • 缓存经常被批量请求的工具定义

示例目录结构:

servers/
├── google-drive/
│   ├── getDocument.ts
│   ├── listFiles.ts
│   └── shareFile.ts
├── slack/
│   ├── sendMessage.ts
│   └── getChannels.ts
└── github/
    ├── createIssue.ts
    └── listRepos.ts

权衡

优点:

  • 大幅降低初始上下文(context)消耗
  • 可扩展至数百乃至数千个工具
  • Agent可通过探索了解工具生态
  • 与基于代码的工具接口自然映射

缺点:

  • 增加发现开销(执行前需额外调用工具)
  • 需要精心设计的组织架构与命名规则
  • 若Agent原本就需要用到多数工具,该方案效果会打折扣
  • 可能需要多轮交互才能找到合适的工具

参考文献

关键词

聚焦Anthropic工程领域,包含2024年发布的基于模型上下文协议(MCP)的代码执行技术内容,以及模型上下文协议(MCP)的官方规范文档。

\n\n 【直译】

  • Anthropic工程:使用模型上下文协议(MCP)的代码执行(2024)
  • 模型上下文协议规范

来源摘要

正在获取来源并生成中文摘要…

来源: https://www.anthropic.com/engineering/code-execution-with-mcp

← 返回社区