📌 定义
Agent Tool Discovery(智能体工具发现)是指AI Agent在运行时自动发现、注册和获取可用工具的能力,而非依赖预先硬编码的工具列表。它通过工具注册中心、MCP协议、工具市场等机制,让Agent能够动态扩展能力边界,实现"边执行边发现"的智能工具获取模式。
🎭 为什么需要工具发现?
静态工具 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-50 | 1-3秒 | 标准化工具 |
| 注册中心 | 100+ | 3-5秒 | 大规模发现 |
| Skills扫描 | 10-30 | 0.5秒 | 本地Skills |
⚠️ 常见踩坑与最佳实践
踩坑一:发现速度拖慢执行
每次任务都重新发现工具会增加3-5秒延迟。建议:启动时一次性发现+定期刷新(每小时),而非每次任务都发现。
每次任务都重新发现工具会增加3-5秒延迟。建议:启动时一次性发现+定期刷新(每小时),而非每次任务都发现。
踩坑二:工具质量参差不齐
注册中心可能有大量低质量工具。建议:建立工具评分机制,优先使用高分工具,新工具需要验证后再信任。
注册中心可能有大量低质量工具。建议:建立工具评分机制,优先使用高分工具,新工具需要验证后再信任。
踩坑三:工具版本不兼容
发现的工具可能是旧版本,与当前Agent不兼容。建议:检查工具的版本要求和兼容性声明。
发现的工具可能是旧版本,与当前Agent不兼容。建议:检查工具的版本要求和兼容性声明。
最佳实践:
- 启动时预加载常用工具,减少运行时发现开销
- 建立工具缓存机制,避免重复发现
- 为每个任务维护一个"推荐工具列表"
- 记录工具使用频率,高频工具优先缓存
- 工具发现失败时,回退到预设工具列表