🔍 Agent Tool Discovery

"智能体工具发现" - 当Agent像逛淘宝一样发现新工具,每一次执行都是一次探索

工具注册 动态发现 MCP OpenClaw

📌 定义

Agent Tool Discovery(智能体工具发现)是指AI Agent在运行时自动发现、注册和获取可用工具的能力,而非依赖预先硬编码的工具列表。它通过工具注册中心、MCP协议、工具市场等机制,让Agent能够动态扩展能力边界,实现"边执行边发现"的智能工具获取模式。

🎭 为什么需要工具发现?

就像你出国旅游,手机里装了几个翻译App,结果到了当地发现还有更好的本地化App——你不会坚持用原来那几个,而是会去App Store搜一搜。Agent Tool Discovery就是给Agent装上一个"App Store",让它知道自己不只能用预设的工具,还能动态发现更好的工具。

静态工具 vs 动态发现

维度静态工具列表动态工具发现
工具数量固定有限动态扩展
获取方式硬编码配置注册中心查询
更新频率需重启更新实时发现新工具
能力边界预设范围内持续扩展
适用场景任务明确、工具稳定任务复杂、需求变化

🛠️ 工具发现的三种机制

1. MCP协议发现(MCP Discovery)

// MCP工具发现流程
async function mcpDiscovery(mcpServerUrl) {
  // 连接MCP服务器
  const mcpClient = new MCPClient(mcpServerUrl);
  
  // 获取工具列表
  const tools = await mcpClient.listTools();
  
  // 解析工具Schema
  const toolRegistry = tools.map(tool => ({
    name: tool.name,
    description: tool.description,
    inputSchema: tool.inputSchema,
    outputSchema: tool.outputSchema,
    metadata: {
      category: tool.category,
      version: tool.version,
      capabilities: tool.capabilities
    }
  }));
  
  return toolRegistry;
}

2. 工具注册中心(Tool Registry)

// 工具注册中心查询
class ToolRegistry {
  private registryUrl = 'https://tools.openclaw.dev/api/v1';
  
  async discoverTools(category?: string) {
    const url = category 
      ? `${this.registryUrl}/tools?category=${category}`
      : `${this.registryUrl}/tools`;
    
    const response = await fetch(url);
    const tools = await response.json();
    
    return tools.map(this.parseToolDefinition);
  }
  
  async searchTools(query: string) {
    // 语义搜索工具
    const queryEmbedding = await embed(query);
    const allTools = await this.discoverTools();
    
    return allTools
      .map(tool => ({
        ...tool,
        relevance: cosineSimilarity(queryEmbedding, tool.embedding)
      }))
      .sort((a, b) => b.relevance - a.relevance)
      .slice(0, 10);
  }
}

3. Skills技能发现(Skills Discovery)

// OpenClaw Skills发现机制
function skillsDiscovery(skillsDir: string) {
  //扫描Skills目录
  const skillFiles = fs.readdirSync(skillsDir)
    .filter(f => f.endsWith('SKILL.md'));
  
  const skills = skillFiles.map(file => {
    const content = fs.readFileSync(file, 'utf8');
    const skill = parseSkillMarkdown(content);
    return {
      name: skill.name,
      description: skill.description,
      triggerConditions: skill.triggers,
      tools: skill.requiredTools
    };
  });
  
  return skills;
}

🔄 工具发现的完整流程

// Agent工具发现系统
class ToolDiscoveryAgent {
  private knownTools: Map;
  private mcpClients: MCPClient[];
  
  async initialize() {
    // 1. 加载预设工具
    this.knownTools = await this.loadDefaultTools();
    
    // 2. 连接MCP服务器
    this.mcpClients = await this.connectMCPServers();
    
    // 3. 发现新工具
    for (const client of this.mcpClients) {
      const tools = await client.listTools();
      tools.forEach(t => this.registerTool(t));
    }
  }
  
  registerTool(tool: Tool) {
    this.knownTools.set(tool.name, {
      ...tool,
      discoveredAt: Date.now(),
      source: 'mcp'
    });
  }
  
  async findToolForTask(task: Task) {
    // 基于任务描述搜索最相关工具
    const candidates = await this.searchTools(task.description);
    
    // 如果没找到,尝试发现新工具
    if (candidates.length === 0) {
      const newTools = await this.discoverNewTools(task);
      candidates.push(...newTools);
    }
    
    return candidates[0];
  }
}

🔧 OpenClaw实战配置

OpenClaw支持多种工具发现方式,通过配置文件指定MCP服务器和工具注册中心。
# openclaw-config.yaml
tool_discovery:
  enabled: true
  
  # MCP服务器配置
  mcp_servers:
    - name: "filesystem"
      url: "stdio://./mcp-servers/filesystem"
      capabilities: ["read", "write", "list"]
    
    - name: "web-tools"
      url: "http://localhost:3000/mcp"
      capabilities: ["fetch", "search"]
    
    - name: "database"
      url: "stdio://./mcp-servers/postgres"
      capabilities: ["query", "insert"]
  
  # 工具注册中心
  registry:
    url: "https://tools.openclaw.dev/api/v1"
    refresh_interval: 3600  # 每小时刷新
    categories: ["search", "file", "code", "data"]
  
  # Skills发现
  skills:
    scan_dirs:
      - "./skills"
      - "./extensions"
    auto_register: true

📊 工具发现的效果

发现方式工具数量发现速度适用场景
硬编码5-10即时任务明确
MCP协议20-501-3秒标准化工具
注册中心100+3-5秒大规模发现
Skills扫描10-300.5秒本地Skills

⚠️ 常见踩坑与最佳实践

踩坑一:发现速度拖慢执行
每次任务都重新发现工具会增加3-5秒延迟。建议:启动时一次性发现+定期刷新(每小时),而非每次任务都发现。
踩坑二:工具质量参差不齐
注册中心可能有大量低质量工具。建议:建立工具评分机制,优先使用高分工具,新工具需要验证后再信任。
踩坑三:工具版本不兼容
发现的工具可能是旧版本,与当前Agent不兼容。建议:检查工具的版本要求和兼容性声明。
最佳实践:
  • 启动时预加载常用工具,减少运行时发现开销
  • 建立工具缓存机制,避免重复发现
  • 为每个任务维护一个"推荐工具列表"
  • 记录工具使用频率,高频工具优先缓存
  • 工具发现失败时,回退到预设工具列表

🔗 相关术语