数据截至 (上游 commit 35efe178d76b)
工具系统与 MCP:给模型装手脚
30 秒导读: 语言模型 只会「输出文本」。要让它真的查数据库、调 API、读知识库,得给它「手脚」——工具(Tool)。本章讲 VoltAgent 怎么把一个函数包成模型能调的工具、怎么组织成百上千个工具、当工具多到塞不进上下文时怎么按语义只挑相关的几个,以及怎么把外部 MCP server 的工具无缝接进来。
本章聚焦「agent 如何调用外部能力」。上一章 01-agent-runtime.md 讲了一次生成的完整生命周期;工具是这个循环里模型「往外伸手」的唯一途径。多 agent 之间互相委派用的 delegate_task 工具是另一回事,见 04-subagents-supervisor.md,本章不讲。
1. 这是什么(零基础也能懂)
一句话定义
工具 = 一个「有名字、有参数说明、有实现」的函数,包装成模型能理解、能调用的形式。
模型看到工具的 name + description + 参数 schema,就知道「有这么个能力、什么时候该用、要传什么参数」;它输出一段结构化的调用请求,运行时把请求落到真实的 execute 函数上,再把结果喂回给模型。
解决什么问题
假设你在做一个「天气助手」agent。用户问「北京明天下雨吗?」——模型本身不知道明天的天气,它的知识停在训练截止日。你需要给它一个 getWeather(city, date) 工具:模型决定「我该查天气」,吐出 {city: "北京", date: "明天"},运行时真的去调气象 API,把 "小雨,12-18°C" 塞回对话,模型再据此回答。
没有工具,模型只能「聊天」;有了工具,它能「做事」。
它能做什么
VoltAgent 的工具系统提供这几层能力:
| 能力 | 干什么 |
|---|---|
| 定义单个工具 | createTool + Zod schema,类型安全 |
| 组织成工具包 | createToolkit 把相关工具打包,可带共享指令 |
| 统一编排 | ToolManager 管理独立工具、工具包、provider 工具,查重、拍平 |
| 内建推理工具 | 开箱即用的 think / analyze 让模型「先想再做」 |
| 语义路由 | 工具太多时,先 searchTools 按语义挑出相关的几个,再 callTool |
| 接入 MCP | 把远程 Model Context Protocol server 的工具当本地工具用 |
| RAG 检索 | 把「知识库检索」也包成一个工具 |