项目详情
深入了解 genai-toolbox 的功能与特性
数据库MCP工具箱
[!注意] 数据库MCP工具箱目前处于测试阶段,在首个稳定版本(v1.0)发布前可能会有重大变更。
数据库MCP工具箱是一个开源的数据库MCP服务器。它通过处理连接池、认证等复杂问题,让你能更轻松、快速、安全地开发工具。
本README提供简要概述。完整文档请参阅官方文档。
[!注意] 该解决方案最初命名为"数据库生成式AI工具箱",因其开发早于MCP。为与新添加的MCP兼容性保持一致,现已更名。
目录
为什么选择工具箱?
工具箱帮助你构建能让智能体访问数据库数据的生成式AI工具。工具箱提供:
- 简化开发:用不到10行代码将工具集成到智能体,在多个智能体或框架间复用工具,更轻松地部署新版本工具
- 更佳性能:内置连接池、认证等最佳实践
- 增强安全:集成认证机制保障数据安全访问
- 端到端可观测:开箱即用的指标和追踪,原生支持OpenTelemetry
⚡ 用AI数据库助手提升工作效率 ⚡
告别频繁切换上下文,让你的AI助手成为真正的开发伙伴。通过MCP工具箱连接IDE和数据库后,你可以将复杂耗时的数据库任务委托给AI,从而更快构建并专注于重要事务。这不仅是代码补全,更是赋予AI处理整个开发生命周期所需的上下文。
它能为你节省时间:
- 自然语言查询:直接在IDE中用自然语言与数据交互。无需编写SQL就能提问复杂问题,如"2024年交付了多少订单?包含哪些商品?"
- 自动化数据库管理:只需描述数据需求,AI助手就能帮你管理数据库。它可以处理查询生成、表创建、索引添加等任务
- 生成上下文感知代码:让AI助手基于实时数据库模式生成可直接使用的应用代码和测试,加速开发周期
- 大幅减少开发开销:显著减少手动设置和样板代码时间。MCP工具箱帮助简化冗长的数据库配置、重复代码和易出错的模式迁移
整体架构
工具箱位于应用编排框架和数据库之间,提供用于修改、分发或调用工具的控制平面。通过集中存储和更新工具,简化工具管理,让你能在不重新部署应用的情况下共享和更新工具。

快速开始
安装服务器
最新版本请查看发布页面,根据操作系统和CPU架构选择以下安装方式。
二进制安装
安装工具箱二进制文件:
# 其他版本请查看发布页面
export VERSION=0.9.0
curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
chmod +x toolbox
容器镜像
也可通过容器安装:# 其他版本请查看发布页面
export VERSION=0.9.0
docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION
运行服务器
配置定义工具的tools.yaml后,执行toolbox启动服务器:
./toolbox --tools-file "tools.yaml"
[!注意] 工具箱默认启用动态重载。如需禁用,使用
--disable-reload标志。
使用toolbox help查看完整标志列表!停止服务器可发送终止信号(多数平台为ctrl+c)。
更详细的部署文档请参阅操作指南
集成到应用
服务器运行后,可将工具加载到应用中。以下是各框架的客户端SDK:
Python (Github)
核心SDK
安装工具箱核心SDK:
bashpip install toolbox-core加载工具:
pythonfrom toolbox_core import ToolboxClient # 将url改为你的服务器地址 async with ToolboxClient("http://127.0.0.1:5000") as client: # 这些工具可传递给应用! tools = await client.load_toolset("工具集名称")详细使用说明见项目README。
LangChain/LangGraph
bashpip install toolbox-langchain加载工具:
pythonfrom toolbox_langchain import ToolboxClient # 将url改为你的服务器地址 async with ToolboxClient("http://127.0.0.1:5000") as client: # 这些工具可传递给应用! tools = client.load_toolset()详细使用说明见项目README。
LlamaIndex
bashpip install toolbox-llamaindex加载工具:
pythonfrom toolbox_llamaindex import ToolboxClient # 将url改为你的服务器地址 async with ToolboxClient("http://127.0.0.1:5000") as client: # 这些工具可传递给应用! tools = client.load_toolset()详细使用说明见项目README。
Javascript/Typescript (Github)
核心SDK
LangChain/LangGraph
安装工具箱核心SDK:
bashnpm install @toolbox-sdk/core加载工具:
javascriptimport { ToolboxClient } from '@toolbox-sdk/core'; // 将url改为你的服务器地址 const URL = 'http://127.0.0.1:5000'; let client = new ToolboxClient(URL); // 这些工具可传递给应用! const toolboxTools = await client.loadToolset('工具集名称'); // 定义工具基础属性:名称、描述、模式和核心逻辑 const getTool = (toolboxTool) => tool(currTool, { name: toolboxTool.getName(), description: toolboxTool.getDescription(), schema: toolboxTool.getParamSchema() }); // 在Langchain/Langraph应用中使用这些工具 const tools = toolboxTools.map(getTool);Genkit
安装工具箱核心SDK:
bashnpm install @toolbox-sdk/core加载工具:
javascriptimport { ToolboxClient } from '@toolbox-sdk/core'; import { genkit } from 'genkit'; // 初始化genkit const ai = genkit({ plugins: [ googleAI({ apiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY }) ], model: googleAI.model('gemini-2.0-flash'), }); // 将url改为你的服务器地址 const URL = 'http://127.0.0.1:5000'; let client = new ToolboxClient(URL); // 这些工具可传递给应用! const toolboxTools = await client.loadToolset('工具集名称'); // 定义工具基础属性:名称、描述、模式和核心逻辑 const getTool = (toolboxTool) => ai.defineTool({ name: toolboxTool.getName(), description: toolboxTool.getDescription(), schema: toolboxTool.getParamSchema() }, toolboxTool) // 在Genkit应用中使用这些工具 const tools = toolboxTools.map(getTool);
Go (Github)
核心SDK
安装工具箱Go SDK:
bashgo get github.com/googleapis/mcp-toolbox-sdk-go加载工具:
gopackage main import ( "github.com/googleapis/mcp-toolbox-sdk-go/core" "context" ) func main() { // 请确保添加错误检查 // 将url改为你的服务器地址 URL := "http://127.0.0.1:5000"; ctx := context.Background() client, err := core.NewToolboxClient(URL) // 框架无关的工具 tools, err := client.LoadToolset("工具集名称", ctx) }详细使用说明见项目README。
LangChain Go
安装工具箱Go SDK:
bashgo get github.com/googleapis/mcp-toolbox-sdk-go加载工具:
gopackage main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" "github.com/tmc/langchaingo/llms" ) func main() { // 请确保添加错误检查 // 将url改为你的服务器地址 URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // 框架无关的工具 tool, err := client.LoadTool("工具名称", ctx) // 获取工具输入模式 inputschema, err := tool.InputSchema() var paramsSchema map[string]any _ = json.Unmarshal(inputschema, ¶msSchema) // 在LangChainGo中使用此工具 langChainTool := llms.Tool{ Type: "function", Function: &llms.FunctionDefinition{ Name: tool.Name(), Description: tool.Description(), Parameters: paramsSchema, }, } }Genkit
安装工具箱Go SDK:
bashgo get github.com/googleapis/mcp-toolbox-sdk-go加载工具:
gopackage main import ( "context" "encoding/json" "github.com/firebase/genkit/go/ai" "github.com/firebase/genkit/go/genkit" "github.com/googleapis/mcp-toolbox-sdk-go/core" "github.com/invopop/jsonschema" ) func main() { // 请确保添加错误检查 // 将url改为你的服务器地址 URL := "http://127.0.0.1:5000" ctx := context.Background() g, err := genkit.Init(ctx) client, err := core.NewToolboxClient(URL) // 框架无关的工具 tool, err := client.LoadTool("工具名称", ctx) // 获取工具输入模式 inputschema, err := tool.InputSchema() var schema *jsonschema.Schema _ = json.Unmarshal(inputschema, &schema) executeFn := func(ctx *ai.ToolContext, input any) (string, error) { result, err := tool.Invoke(ctx, input.(map[string]any)) if err != nil { // 传播工具调用错误 return "", err } return result.(string), nil } // 在Genkit Go中使用此工具 genkitTool := genkit.DefineToolWithInputSchema( g, tool.Name(), tool.Description(), schema, executeFn, ) }Go GenAI
安装工具箱Go SDK:
bashgo get github.com/googleapis/mcp-toolbox-sdk-go加载工具:
gopackage main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" "google.golang.org/genai" ) func main() { // 请确保添加错误检查 // 将url改为你的服务器地址 URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // 框架无关的工具 tool, err := client.LoadTool("工具名称", ctx) // 获取工具输入模式 inputschema, err := tool.InputSchema() var schema *genai.Schema _ = json.Unmarshal(inputschema, &schema) funcDeclaration := &genai.FunctionDeclaration{ Name: tool.Name(), Description: tool.Description(), Parameters: schema, } // 在Go GenAI中使用此工具 genAITool := &genai.Tool{ FunctionDeclarations: []*genai.FunctionDeclaration{funcDeclaration}, } }OpenAI Go
安装工具箱Go SDK:
bashgo get github.com/googleapis/mcp-toolbox-sdk-go加载工具:
gopackage main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" openai "github.com/openai/openai-go" ) func main() { // 请确保添加错误检查 // 将url改为你的服务器地址 URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // 框架无关的工具 tool, err := client.LoadTool("工具名称", ctx) // 获取工具输入模式 inputschema, err := tool.InputSchema() var paramsSchema openai.FunctionParameters _ = json.Unmarshal(inputschema, ¶msSchema) // 在OpenAI Go中使用此工具 openAITool := openai.ChatCompletionToolParam{ Function: openai.FunctionDefinitionParam{ Name: tool.Name(), Description: openai.String(tool.Description()), Parameters: paramsSchema, }, } }
配置
主要通过tools.yaml文件配置工具箱。如有多个文件,可用--tools-file tools.yaml标志指定加载哪个文件。
各资源类型的详细参考文档见资源。
数据源
tools.yaml的sources部分定义工具箱可访问的数据源。多数工具至少需要一个数据源执行操作。
sources:
我的pg数据源:
kind: postgres
host: 127.0.0.1
port: 5432
database: toolbox_db
user: toolbox_user
password: 我的密码
不同类型数据源的详细配置见数据源。
工具
tools.yaml的tools部分定义智能体可执行的操作:工具类型、影响的数据源、使用参数等。
tools:
按名称搜索酒店:
kind: postgres-sql
source: 我的pg数据源
description: 根据名称搜索酒店。
parameters:
- name: 名称
type: string
description: 酒店名称。
statement: SELECT * FROM hotels WHERE name ILIKE '%' || $1 || '%';
不同类型工具的详细配置见工具。
工具集
tools.yaml的toolsets部分可定义要一起加载的工具组。便于基于不同智能体或应用定义工具组。
toolsets:
我的第一个工具集:
- 我的第一个工具
- 我的第二个工具
我的第二个工具集:
- 我的第二个工具
- 我的第三个工具
可按名称加载工具集:
# 这将加载所有工具
all_tools = client.load_toolset()
# 这将仅加载'我的第二个工具集'中列出的工具
my_second_toolset = client.load_toolset("我的第二个工具集")
版本控制
本项目采用语义化版本,包括随以下情况递增的主版本.次版本.修订号:
- 主版本:进行不兼容的API变更时
- 次版本:以向后兼容方式添加功能时
- 修订号:进行向后兼容的问题修复时
这适用于工具箱的CLI、与官方SDK的交互以及tools.yaml文件中的定义。
贡献指南
欢迎贡献。请参阅贡献指南开始参与。
请注意本项目采用贡献者行为准则。参与即表示你同意遵守其条款。详情见贡献者行为准则。
社区
加入我们的Discord社区与开发者交流!