
MCP Toolbox 本地快速上手为 AI Agent 准备 PostgreSQL 数据库与示例数据【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox本文是 MCP Toolbox for Databases 本地快速上手的数据库准备篇聚焦于 Quickstart 全流程的第一步为即将接入 Agent 的 PostgreSQL 数据库创建专用账号、建立业务数据库、建表并灌入示例数据。它被 Python、Go、JavaScript 三套本地快速上手文档以共享片段shared snippet的方式复用是让后续tools.yaml中的工具定义与 Agent 调用真正跑通的前提。读完本文你将掌握一套可复现的 PostgreSQL 初始化流程含常见连接故障排查并理解 Toolbox 侧postgres数据源配置如何与本步骤创建的用户、库、表一一对应。这段文档在整个 Quickstart 中的位置本步骤来自共享片段 database_setup.md通过 Hugo 的regionInclude机制被同时嵌入三份本地快速上手文档的 “Step 1: Set up your database” 小节local_quickstart.mdPython配合 ADK、LangChain、LlamaIndex、Google GenAIlocal_quickstart_go.mdGo配合 LangChain Go、Genkit Go、Go GenAI、OpenAI Golocal_quickstart_js.mdJavaScript/TypeScript。整体流程为Step 1 数据库准备本文→ Step 2 下载并配置 Toolboxconfigure_toolbox.md编写tools.yaml并启动服务→ Step 3 让 Agent 通过 SDK 加载 Toolbox 的工具并执行查询。数据库准备是后续所有工具定义的数据基础——tools.yaml里每个 SQL 工具都指向本步骤创建的toolbox_db与hotels表。前置条件已安装PostgreSQL 16且安装了psql命令行客户端拥有可连接本机 PostgreSQL 的操作系统权限Linux/macOS 下通常可通过sudo切换用户。第一步使用 psql 连接 PostgreSQL在终端执行以下命令以默认超级用户postgres连接本机 PostgreSQLpsql -h 127.0.0.1 -U postgres其中-h 127.0.0.1指定通过 TCP 连接本机-U postgres指定以 PostgreSQL 默认超级用户postgres登录。连接成功后你将进入psql交互式 shell提示符形如postgres#后续所有建库、建表命令都在该 shell 内执行。连接失败怎么办三类典型问题官方文档针对初次连接最常见的三类报错给出了排查路径1. 密码提示Password Prompt如果系统提示你输入postgres用户的密码而你不知道密码或直接回车空密码无效说明该 PostgreSQL 安装可能要求密码认证或使用了不同的认证方式而不是信任本机连接。2.FATAL: role postgres does not exist该报错表示默认超级用户角色postgres在你的系统上并不存在这个名字。此时需要先确认安装时创建的管理员角色名称再以该角色登录。3.Connection refused表示连接被拒绝通常意味着 PostgreSQL 服务根本没有启动。在 Linux 系统上可以先检查并启动服务sudo systemctl status postgresql sudo systemctl start postgresql通用解法切换为 postgres 操作系统用户peer 认证对于密码问题或postgres角色无法直接访问的情况官方推荐的解法是先切换到postgres操作系统用户。该用户对本机连接往往拥有免密码权限即 PostgreSQL 的peer 认证本地连接直接以操作系统用户名作为数据库用户名验证sudo -i -u postgres psql -h 127.0.0.1进入psqlshell 后可继续执行后续建库步骤完成后输入\q退出psql再输入exit返回你原来的用户 shell。如果你希望之后能直接用-U postgres加密码连接可以在以postgres操作系统用户进入psql后为postgres数据库用户设置密码ALTER USER postgres WITH PASSWORD your_chosen_password;第二步创建数据库与专用用户连接到psql后依次执行以下 SQLCREATE USER toolbox_user WITH PASSWORD my-password; CREATE DATABASE toolbox_db; GRANT ALL PRIVILEGES ON DATABASE toolbox_db TO toolbox_user; ALTER DATABASE toolbox_db OWNER TO toolbox_user;各语句作用说明SQL 语句作用CREATE USER toolbox_user WITH PASSWORD my-password;创建 Toolbox 专用的数据库登录账号PostgreSQL 中CREATE USER即带登录权限的CREATE ROLECREATE DATABASE toolbox_db;创建业务数据库toolbox_dbGRANT ALL PRIVILEGES ON DATABASE toolbox_db TO toolbox_user;将数据库上的全部权限授予toolbox_userALTER DATABASE toolbox_db OWNER TO toolbox_user;将数据库的所有者变更为toolbox_user确保后续建表、读写不需要额外授权最小权限原则官方文档特别提醒真实应用中应遵循最小权限原则只授予应用实际需要的权限。这里是快速上手所以一次性授予了全部权限生产环境应把权限收敛到具体表级甚至列级并配合下方“环境变量替换”避免密码硬编码。实践建议不要在配置文件里硬编码密码文档强调在实际使用中应使用${ENV_NAME}格式的环境变量替换而不是把my-password这类秘密直接写进配置文件。仓库内置的预置配置 internal/prebuiltconfigs/tools/postgres.yaml 正是这一实践的示范——它的数据源字段全部通过环境变量注入且支持带默认值的形式kind: source name: postgresql-source type: postgres host: ${POSTGRES_HOST:localhost} port: ${POSTGRES_PORT:5432} database: ${POSTGRES_DATABASE} user: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} queryParams: ${POSTGRES_QUERY_PARAMS:}${POSTGRES_HOST:localhost}中的冒号后为默认值环境变量未设置时自动回退到localhost。这样CREATE USER时设置的密码只需出现在环境变量或密钥管理系统中而不会泄露在 YAML 文件里。源码印证postgres 数据源如何接收这些连接信息从源码看Toolbox 的 PostgreSQL 数据源由 internal/sources/postgres/postgres.go 中的Config结构体定义其 YAML 字段与上面创建的用户、库完全对应type Config struct { Name string yaml:name validate:required Type string yaml:type validate:required Host string yaml:host validate:required Port string yaml:port validate:required User string yaml:user validate:required Password string yaml:password validate:required Database string yaml:database validate:required QueryParams map[string]string yaml:queryParams QueryExecMode string yaml:queryExecMode validate:omitempty,oneofcache_statement cache_describe describe_exec exec simple_protocol SQLCommenter *bool yaml:sqlCommenter ConnectTimeout *int yaml:connectTimeout validate:omitempty,gte1 }其中host、port、user、password、database五个字段均标记为required——这正是本步骤创建的用户名toolbox_user、密码、库名toolbox_db以及127.0.0.1:5432连接信息将要填进tools.yaml数据源定义的位置。此外queryExecMode控制连接池执行 SQL 的模式如simple_protocol禁用预处理sqlCommenter控制是否注入 SQL 注释以携带上下文connectTimeout单位秒最小 1限制单次连接尝试的耗时上限可用于避免 Agent 调用时长时间卡在不可达的数据源上。从该文件的结构可以推断每个 source 在运行期都会初始化为一个独立的连接池或客户端见initPostgresConnectionPool工具执行时复用它来连接数据库。第三步退出 psql 会话完成建库、建用户后先退出当前会话\q如果之前是通过sudo -i -u postgres进入的\q之后还需输入exit才能离开postgres用户的 shell回到你自己的用户环境。第四步用新用户连接业务数据库以刚创建的toolbox_user连接toolbox_db验证权限是否生效psql -h 127.0.0.1 -U toolbox_user -d toolbox_db-d toolbox_db指定连接的数据库名。能成功进入psql即说明第 2 步创建的账号、库以及授权均正确——这也正是后续 Toolbox 数据源将要建立的连接方式。第五步创建 hotels 表继续在该psql会话中执行建表语句创建一个酒店预订场景的业务表CREATE TABLE hotels( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR NOT NULL, location VARCHAR NOT NULL, price_tier VARCHAR NOT NULL, checkin_date DATE NOT NULL, checkout_date DATE NOT NULL, booked BIT NOT NULL );字段设计说明字段类型说明idINTEGER NOT NULL PRIMARY KEY酒店唯一标识主键nameVARCHAR NOT NULL酒店名称locationVARCHAR NOT NULL所在城市price_tierVARCHAR NOT NULL价格档位如 Luxury、Upscale、Midscalecheckin_date/checkout_dateDATE NOT NULL入住 / 退房日期bookedBIT NOT NULL预订状态位B0未预订、B1已预订选择BIT类型的booked字段是刻意的后续tools.yaml中的book-hotel/cancel-hotel工具将直接通过UPDATE hotels SET booked B1 WHERE id $1/B0来翻转预订状态类型与 SQL 字面量保持严格一致。第六步插入示例数据执行以下INSERT语句向hotels表灌入 10 条覆盖瑞士多个城市的示例数据日期均为 2024 年 4 月INSERT INTO hotels(id, name, location, price_tier, checkin_date, checkout_date, booked) VALUES (1, Hilton Basel, Basel, Luxury, 2024-04-22, 2024-04-20, B0), (2, Marriott Zurich, Zurich, Upscale, 2024-04-14, 2024-04-21, B0), (3, Hyatt Regency Basel, Basel, Upper Upscale, 2024-04-02, 2024-04-20, B0), (4, Radisson Blu Lucerne, Lucerne, Midscale, 2024-04-24, 2024-04-05, B0), (5, Best Western Bern, Bern, Upper Midscale, 2024-04-23, 2024-04-01, B0), (6, InterContinental Geneva, Geneva, Luxury, 2024-04-23, 2024-04-28, B0), (7, Sheraton Zurich, Zurich, Upper Upscale, 2024-04-27, 2024-04-02, B0), (8, Holiday Inn Basel, Basel, Upper Midscale, 2024-04-24, 2024-04-09, B0), (9, Courtyard Zurich, Zurich, Upscale, 2024-04-03, 2024-04-13, B0), (10, Comfort Inn Bern, Bern, Midscale, 2024-04-04, 2024-04-16, B0);数据设计上的两个细节值得注意B0是 PostgreSQL 的位串字面量表示 1 位二进制0与booked BIT列类型匹配全部 10 行初始均为“未预订”为后续 Agent 的“搜索→预订→取消”演示保留操作空间部分记录的checkout_date早于checkin_date如 1 号酒店2024-04-22入住、2024-04-20退房这是刻意保留的脏数据用于演示 Agent 调用update-hotel工具修正入住/退房日期的场景——对应工具的定义为UPDATE hotels SET checkin_date CAST($2 as date), checkout_date CAST($3 as date) WHERE id $1。第七步再次退出会话数据插入完成后退出\q至此数据库侧准备完毕名为toolbox_db的业务库、toolbox_user账号、hotels表及 10 条示例数据均已就绪。这些数据将如何被 Toolbox 使用数据库准备完成后后续快速上手文档会在 configure_toolbox.md 中编写tools.yaml先定义一个指向toolbox_db的postgres数据源再定义一组直接查询本步骤建好的hotels表的postgres-sql工具例如kind: source name: my-pg-source type: postgres host: 127.0.0.1 port: 5432 database: toolbox_db user: toolbox_user password: my-password --- kind: tool name: search-hotels-by-name type: postgres-sql source: my-pg-source description: Search for hotels based on name. parameters: - name: name type: string description: The name of the hotel. statement: SELECT * FROM hotels WHERE name ILIKE % || $1 || %;其中数据源的database、user、password正是本步骤CREATE DATABASE/CREATE USER时设置的值如自定义过需同步更新search-hotels-by-name、search-hotels-by-location、book-hotel、update-hotel、cancel-hotel等工具则分别查询或更新hotels表。之后 Agent如 Python SDK 的 core 示例会通过ToolboxClient加载这些工具执行“在 Basel 找酒店 → 预订 Hilton Basel → 取消 → 修改入住日期”的完整对话流程。关于工具定义中参数类型string/integer/array 等、可选参数与默认值的详细规则可进一步阅读 Tools 配置文档 与 Sources 配置文档。小结与最佳实践本步骤虽然只做“建库、建表、灌数据”三件事却是整个 MCP Toolbox 快速上手能否跑通的地基。复盘几个关键实践点连接排障三板斧密码/角色问题优先尝试sudo -i -u postgres走 peer 认证Connection refused先确认服务已启动专用账号而非超级用户为 Toolbox 单独创建toolbox_user避免 Agent 以超级用户身份操作数据库生产环境进一步收敛为最小权限密码不进配置文件用${ENV_NAME}环境变量替换参考 postgres.yaml 的预置写法数据与工具强对应表结构、BIT预订位、刻意保留的脏数据都与后续tools.yaml中的 SQL 工具一一咬合方便你端到端验证 Agent 的真实工具调用效果。【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考