news 2026/9/14 15:04:00

MCP Toolbox Sources 配置完全指南:在 tools.yaml 中定义数据源并解锁数据库工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MCP Toolbox Sources 配置完全指南:在 tools.yaml 中定义数据源并解锁数据库工具

MCP Toolbox Sources 配置完全指南:在 tools.yaml 中定义数据源并解锁数据库工具

【免费下载链接】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中的Source是"工具可以交互的数据源"的抽象:一个 Source 代表一个数据库或 HTTP 服务连接,在tools.yaml中以kind: source声明。本文以官方配置文档 docs/en/documentation/configuration/sources/_index.md 为主体,结合仓库源码讲解 Source 的配置字段、环境变量注入、解析流程与底层连接管理机制,读完你就能为 Cloud SQL、PostgreSQL、MySQL 等任意受支持数据库编写可运行的 Source 配置,并理解它如何解锁一批专用工具。

Source 是什么:工具与数据库之间的连接抽象

在 MCP Toolbox 中,Source 表示一个工具可以交互的数据源。你可以在tools.yaml文件的source区域中以映射(map)的形式定义任意多个 Source。通常,一个 Source 配置包含连接并交互数据库所需的全部信息——地址、端口、认证凭据、目标数据库等。

从实现角度看,每个 Source 在运行时都是一个独立的连接池(connection pool)或客户端(client),工具通过它连接数据库并执行操作。这也是为什么配置文档特别强调:连接信息属于敏感数据,不要把密钥硬编码进配置文件。

建议使用${ENV_NAME}格式的环境变量替换来替代在配置文件中硬编码你的密钥。

一个最小的 Cloud SQL PostgreSQL Source 配置如下(出自官方文档):

kind: source name: my-cloud-sql-source type: cloud-sql-postgres project: my-project-id region: us-central1 instance: my-instance-name database: my_db user: ${USER_NAME} password: ${PASSWORD}

这段配置声明了一个名为my-cloud-sql-source的 Source,其类型为cloud-sql-postgres,指定了 GCP 项目、区域、实例、数据库名,用户名和密码则通过${USER_NAME}${PASSWORD}两个环境变量注入,避免明文写入文件。

Source 配置结构逐字段拆解

一个kind: source文档由通用字段和类型相关字段组成。通用字段在 internal/server/config.go 的UnmarshalYAMLSourceConfig中解析:

字段必填说明
kind固定为source,用于区分同一文件中的其他配置类型(tooltoolsetgrouppromptresource等)
nameSource 的唯一名称,工具通过source: <name>引用它;同一文件中名称不可重复,重复声明会报错
typeSource 类型,决定后续字段如何解析,如cloud-sql-postgrespostgresmysql
其余字段视类型而定与具体数据库/服务的连接参数,见下方分类

在 internal/server/config.go 中,kind: source的文档会被分发到UnmarshalYAMLSourceConfig:先读取type字段,再以严格解码器(strict decoder)把剩余字段交给sources.DecodeConfig按类型解析。也就是说,配置校验是类型驱动的——字段是否合法取决于你声明的type

通用数据库 Source 的参数

以仓库内置的 internal/prebuiltconfigs/tools/postgres.yaml 为例,postgres类型的 Source 配置为:

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:}

字段含义:

  • host:数据库主机地址。这里使用了${POSTGRES_HOST:localhost}语法,冒号后是默认值——环境变量未设置时回退到localhost,方便本地开发。
  • port:端口号,默认5432
  • database:目标数据库名。
  • user/password:认证凭据,强烈建议用环境变量注入。
  • queryParams:附加的连接查询参数(如 SSL 配置),可为空字符串。

Cloud SQL 类型 Source 的参数

官方文档示例中的cloud-sql-postgres使用 GCP 资源定位方式:

  • project:GCP 项目 ID。
  • region:实例所在区域。
  • instance:实例名称。
  • database:数据库名。
  • user/password:数据库用户与密码。

从源码看,Cloud SQL 类连接还支持更细粒度的网络与认证控制:internal/sources/util.go 中的GetCloudSQLOpts支持通过ipType指定连接方式,必须是publicprivatepsc三者之一,并可配合useIAM启用 Cloud SQL IAM 数据库认证(WithIAMAuthN)。这类参数在不同 Cloud SQL 集成文档(如cloud-sql-mysqlcloud-sql-mssql)中各有对应配置项,具体字段以对应集成文档为准。

环境变量替换:${ENV_NAME} 与默认值语法

Source 配置支持环境变量替换,格式为${ENV_NAME}。仓库的配置解析基于 goccy/go-yaml 与 internal/sources/sources.go),环境变量展开发生在 YAML 解码之前。

更实用的是带默认值的写法${ENV_NAME:default}

host: ${POSTGRES_HOST:localhost} # 未设置 POSTGRES_HOST 时使用 localhost port: ${POSTGRES_PORT:5432} # 未设置 POSTGRES_PORT 时使用 5432 queryParams: ${POSTGRES_QUERY_PARAMS:} # 默认值为空字符串

这种写法让同一份tools.yaml可以在本地与生产环境复用:开发环境不导出任何变量即用默认值,生产环境通过环境变量注入真实连接信息,密钥永不落盘。

从源码看 Source 的解析与注册机制

Source 的类型系统定义在 internal/sources/sources.go:

  • SourceConfigFactory:创建SourceConfig的工厂函数签名func(ctx, name, *yaml.Decoder) (SourceConfig, error)
  • 注册表sourceRegistry:包级 map,各数据库实现通过Register(sourceType, factory)把自己注册进来;若类型已存在则返回false且不覆盖(internal/sources/sources.go)。
  • DecodeConfig:按type从注册表取出工厂解析配置;类型不存在时返回unknown source type: %q错误(internal/sources/sources.go)。
  • SourceConfig接口:要求实现SourceConfigType()Initialize(ctx, tracer) (Source, error)——配置负责初始化出可用的连接对象。
  • Source接口:要求实现SourceType()ToConfig()IsReadOnly()。其中IsReadOnly()标记该数据源是否为只读,是只读安全特性(read-only 模式)的判定依据之一。

配置与实现分离是这套设计的关键:tools.yaml里你写的kind: source+type只是声明;真正"连接"发生在服务启动时对每个SourceConfig调用Initialize,此时才会建立连接池或客户端。

底层连接管理:连接池、延迟初始化与 60 秒超时

文档指出"每个 source 是一个连接池或客户端"。仓库在 internal/sources/connect.go 中提供了统一连接管理组件ConnectOnce[T],其设计要点可以从源码注释与实现中确认:

  • 延迟连接(lazy connect):连接在首次使用时通过Do建立而非启动时强制建立(internal/sources/connect.go)。并发调用方共享同一次连接尝试(基于singleflight.Group),失败的尝试不会被缓存,下一个调用者会重试。
  • 连接超时上限ConnectTimeout = 60 * time.Second,注释明确它按"冷启动的云连接器路径"而非健康连接来设定上限(internal/sources/connect.go);WithMinConnectTimeout可以抬高上限,但不会把上限压低。
  • 安全关闭Close释放已建立的连接并阻止新连接,重复调用安全(internal/sources/connect.go)。由于不同驱动关闭方式各异(pgx 的Close、neo4j 驱动接收 context、mongo 的Disconnect),关闭函数通过OnClose显式注册而非接口断言。
  • 可观测性:每次连接建立都会产生toolbox/server/source/connect追踪 span,携带source_typesource_name属性(internal/sources/sources.go),连接失败时 span 会被标记为 error。

此外,internal/sources/util.go 的NormalizeValue展示了连接之上的数据加工:PostgreSQL 的 UUID(OID 2950)与 UUID 数组(OID 2951)会被自动转换为字符串表示,保证工具返回值对 LLM 友好。

Source 如何解锁工具:source 字段与预置配置

Source 本身不产生能力,能力来自绑定到该 Source 上的工具。在tools.yaml中,工具通过source: <source-name>引用数据源。例如 internal/prebuiltconfigs/tools/postgres.yaml:

kind: tool name: execute_sql type: postgres-execute-sql source: postgresql-source description: Use this tool to execute a single SQL statement.

同一个 Source 可以被几十个工具共享:上述 Postgres 预置配置中,execute_sqllist_tableslist_active_queriesdatabase_overviewlist_indexes等数十个工具全部指向postgresql-source,并通过kind: toolsetdatamonitorhealthreplication等)分组暴露给客户端。

这与 docs/en/integrations/_index.md 的说明一致:一个 Source 连接定义一次,即可解锁一整套专用工具(查询数据、列出表、分析 schema 等)。

使用预置配置快速上手

如果你不想从零编写 Source 配置,可以使用仓库自带的预置配置。根据 docs/en/documentation/configuration/prebuilt-configs/_index.md 的说明:

  • --prebuilt配合--config--configs--config-folder将预置配置与自定义工具组合;
  • 可以组合多个预置配置;
  • /追加工具集名称来只加载其中一部分,例如--prebuilt=postgres/data只加载 SQL 工具。

需要提醒的是,预置配置中的动态 SQL 工具(如execute_sql)允许 Agent 直接提交原始 SQL。官方文档明确警告:这类工具应使用只具备 Agent 所需最小权限的专用数据库身份运行(如仅SELECT权限),避免使用 owner、admin 或迁移账号,也不要用正则关键词黑名单来试图让任意 SQL 端点变得安全。

查看所有受支持的 Source 类型

本文只深入剖析了cloud-sql-postgrespostgres两种类型,但 MCP Toolbox 支持的 Source 远不止于此。完整的受支持 Source 列表及其解锁的专用工具,请查看仓库的 Integrations 索引,其中按集成分类(BigQuery、MySQL、MongoDB、Spanner、Snowflake、Cloud Storage 等)提供了各自的tools.yaml连接片段与可用工具清单。

小结

  • Source 是 tools.yaml 中的kind: source声明,承载连接数据库所需的全部信息,运行时表现为独立的连接池或客户端。
  • 字段分两层kind/name/type是通用结构,连接参数由type决定(host/port/database/user/password适用于通用数据库,project/region/instance适用于 Cloud SQL)。
  • 密钥必须走环境变量${ENV_NAME}注入、${ENV_NAME:default}提供回退值。
  • 底层由类型注册表驱动Register+DecodeConfig完成配置解析,Initialize建立连接,ConnectOnce负责延迟连接、60 秒超时上限与并发去重。
  • 工具通过source字段绑定数据源,一个 Source 可解锁整套工具,可用--prebuilt快速加载预置配置。

【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 15:03:50

陈氏超混沌系统与DNA编码图像加密MATLAB实现

简介&#xff1a;本资源是一套基于陈氏超混沌系统与DNA编码理论实现的位级图像加密算法MATLAB仿真源码&#xff0c;面向计算机、人工智能、电子信息、通信工程等专业的本科生、研究生及课程设计实践者&#xff0c;解决图像信息安全中的高安全性加密建模与仿真实现问题。压缩包共…

作者头像 李华
网站建设 2026/9/14 15:03:37

Ubuntu 26.04 LTS 裸机安装全流程:从分区避坑到开发环境搭建

玩 Linux 这么多年&#xff0c;我一直觉得“装系统”这件事最容易被低估。尤其那种从空白硬盘开始的裸机安装&#xff0c;看起来就是插个 U 盘、点几下下一步&#xff0c;可真正操作起来&#xff0c;几乎每一台机器都能给你整点不一样的幺蛾子。我最近给一台新机器从头装 Ubunt…

作者头像 李华
网站建设 2026/9/14 15:02:20

Windows原版镜像下载官方与第三方渠道合集及校验制作指南

很多人搜"Windows系统原版镜像下载"&#xff0c;点进排名靠前的站点&#xff0c;却下载回来一个被二次打包的安装包&#xff0c;装完桌面全是全家桶&#xff0c;首页也被改得一塌糊涂。我前后帮人装机不下几十次&#xff0c;这种坑已经看得太多。这篇直接整理一份能照…

作者头像 李华
网站建设 2026/9/14 15:01:52

Python面向对象编程核心技术与实战应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华