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