MCP Toolbox 集成 Valkey 实战指南:数据源配置、IAM 认证与动态命令工具
【免费下载链接】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 中接入 Valkey:以官方文档 Valkey Source 与 valkey 工具文档 为主体骨架,结合 internal/sources/valkey/valkey.go 与 internal/tools/valkey/valkey.go 源码实现,完整覆盖 Valkey 数据源(source)的配置字段、GCP Memorystore for Valkey 的 IAM 认证接入方式,以及通过 valkey 工具按序执行预定义命令并支持$变量动态参数注入的完整方案。读完本文,你可以直接编写一套可运行、可复制的 Valkey 数据源与命令工具 YAML 配置,并理解其底层调用链。
Valkey 集成概览
Valkey 是一个开源的、基于内存的数据结构存储服务,源自 Redis 的一个分支,被设计用于数据库、缓存和消息代理等场景,支持字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、支持范围查询的有序集合(sorted sets with range queries)、位图(bitmaps)、HyperLogLog 以及支持半径查询的地理空间索引(geospatial indexes with radius queries)等多种数据结构。
在 MCP Toolbox 中,Valkey 集成由两部分组成:
- valkey 数据源(source):声明
type: valkey,负责建立到 Valkey 实例的连接(含密码认证与 GCP IAM 认证两种模式),并在初始化时通过PING命令验证连通性; - valkey 工具(tool):声明
type: valkey,基于某个 valkey 数据源,把一组预定义的 Valkey 命令按顺序执行,并把每个命令的返回值聚合后返回给 MCP 客户端。
从源码结构看,数据源实现位于 internal/sources/valkey/valkey.go(SourceType = "valkey"),工具实现位于 internal/tools/valkey/valkey.go(resourceType = "valkey"),二者通过init()中的Register机制注册到全局的 source / tool 注册表,与仓库中其他几十个数据库集成保持同一套插件式架构。
配置 Valkey 数据源
在 MCP Toolbox 的配置文件(如tools.yaml)中,Valkey 数据源使用kind: source声明。官方文档给出的最小可用示例(来自 docs/en/integrations/valkey/source.md)如下:
kind: source name: my-valkey-instance type: valkey address: - 127.0.0.1:6379 username: ${YOUR_USERNAME} password: ${YOUR_PASSWORD} # database: 0 # useGCPIAM: false # disableCache: false官方文档特别提示:应使用${ENV_NAME}格式的环境变量替换来引用密钥,而不是把密码等敏感信息硬编码进配置文件。这一机制与仓库统一的配置解析流程一致——数据源通过yaml.Decoder解码,${...}占位符在配置加载阶段被替换为环境变量的实际值。
数据源字段参考
官方文档完整给出了 valkey 数据源的字段表,整理如下:
| field | type | required | description |
|---|---|---|---|
| type | string | true | 必须为 "valkey"。 |
| address | []string | true | 要连接的 Valkey 实例端点列表。 |
| username | string | false | 如果使用非默认用户,在此指定用户名;如果使用 Memorystore for Valkey,请留空。 |
| password | string | false | Valkey 实例的密码。 |
| database | int | false | 要连接的 Valkey 数据库;不适用于集群(cluster enabled)实例,默认数据库为0。 |
| useGCPIAM | bool | false | 如果使用 GCP 的 IAM 认证,设为true,默认为false。 |
| disableCache | bool | false | 是否关闭客户端侧缓存(client-side caching),默认为false。 |
源码印证:字段结构与必填校验
数据源字段与 internal/sources/valkey/valkey.go 中的Config结构体一一对应:
type Config struct { Name string `yaml:"name" validate:"required"` Type string `yaml:"type" validate:"required"` Address []string `yaml:"address" validate:"required"` Username string `yaml:"username"` Password string `yaml:"password"` Database int `yaml:"database"` UseGCPIAM bool `yaml:"useGCPIAM"` DisableCache bool `yaml:"disableCache"` }其中name、type、address三个字段带有validate:"required"标签,与文档中 required 标记完全一致;useGCPIAM、disableCache均为可选布尔字段,缺省即false。从实现看,disableCache会被直接透传给 valkey-go 客户端的ClientOption.DisableCache,用于控制客户端侧缓存行为(internal/sources/valkey/valkey.go),默认不缓存。
连接建立与连通性自检
数据源初始化时,initValkeyClient会完成三件事(internal/sources/valkey/valkey.go):
- 根据
useGCPIAM决定是否注入AuthCredentialsFn(详见下一节); - 调用 valkey-go 的
valkey.NewClient创建客户端,传入InitAddress(即address列表)、SelectDB(即database)、Username、Password等选项; - 构建并执行一次
PING命令(client.B().Ping().Build()),若PING失败则直接终止,从而在启动阶段就完成连通性自检,避免把"连接不上的数据源"暴露给后续工具调用。
address是[]string类型,支持配置多个端点,这在连接集群或故障转移场景下尤其有用。
使用 GCP Memorystore for Valkey 的 IAM 认证
如果使用 GCP 的 Memorystore for Valkey 托管服务,可以改用 IAM 认证而无需静态密码。操作分两步:先在 GCP 侧为你的账号授予所需的 IAM 角色(详见 Google Cloud Memorystore for Valkey 官方 IAM 认证文档),然后把数据源配置中的useGCPIAM设为true:
kind: source name: my-valkey-instance type: valkey address: - 127.0.0.1:6379 useGCPIAM: true注意官方文档的约束:使用 Memorystore for Valkey 时,username字段应留空;开启 IAM 认证时同样无需填写password,认证凭据由运行时动态获取。
源码印证:IAM 令牌如何注入
从源码看,IAM 认证的实现非常直接(internal/sources/valkey/valkey.go):当r.UseGCPIAM为true时,会构造一个AuthCredentialsFn,每次认证时调用sources.GetIAMAccessToken(ctx)获取访问令牌,并以Username: "default"、Password: token的形式作为认证凭据:
authFn = func(valkey.AuthCredentialsContext) (valkey.AuthCredentials, error) { token, err := sources.GetIAMAccessToken(ctx) creds := valkey.AuthCredentials{Username: "default", Password: token} if err != nil { return creds, err } return creds, nil }这意味着使用 IAM 认证时,实际连接的用户名固定为default,密码为动态刷新的 GCP 访问令牌,从而避免在配置文件中保存长期有效的静态密码。GetIAMAccessToken由 internal/sources 包统一提供,与仓库中其他支持 GCP IAM 的数据库集成共用同一套令牌获取逻辑。
定义 valkey 工具:按序执行预定义命令
数据源负责"连得上",工具则负责"做什么"。valkey 工具的核心能力是:针对一个 valkey 数据源,顺序执行一系列预定义的 Valkey 命令,并把每个命令的执行结果聚合返回(docs/en/integrations/valkey/tools/valkey-tool.md)。
每条命令用一个字符串数组表示:数组第一个元素是命令名(如SET、GET、HGETALL),后续元素是该命令的参数。多个命令按配置顺序依次执行,因此可以组合出"先写后读""先删再查"等业务序列。
动态命令参数:$变量模板注入
命令参数支持$variableName模板注解:配置中以$开头的占位符会在运行时被工具的实际入参替换,从而实现"一个工具、多种调用"。特别地,数组类型的参数会被展开(flatten)成多个参数,例如:
commands: - [SADD, userNames, $userNames] # Array will be flattened into multiple arguments. parameters: - name: userNames type: array description: The user names to be set.如果运行时输入的是字符串数组["Alice", "Sid", "Bob"],则参数展开后最终执行的命令为:
[SADD, userNames, Alice, Sid, Bob]这正是SADD这类集合命令最常见的用法——一次把多个成员加入集合,而不必为每个成员单独发一条命令。
完整工具配置示例
官方文档给出的 valkey 工具完整示例(docs/en/integrations/valkey/tools/valkey-tool.md)如下:
kind: tool name: user_data_tool type: valkey source: my-valkey-instance description: | Use this tool to interact with user data stored in Valkey. It can set, retrieve, and delete user-specific information. commands: - [SADD, userNames, $userNames] # Array will be flattened into multiple arguments. - [GET, $userId] parameters: - name: userId type: string description: The unique identifier for the user. - name: userNames type: array description: The user names to be set.配置要点:
source必须指向一个已定义的 valkey 数据源(即前面kind: source配置中的name),工具通过它获取客户端连接;commands为命令列表,按顺序执行;description为必填项,会被用作 MCP 工具清单(manifest)中的描述,供 LLM 理解工具用途;parameters声明工具的输入参数,其中type支持string、array等类型,array类型在展开时会把每个元素依次追加到命令参数位。
源码印证:参数替换与批量执行
工具的参数替换逻辑位于 internal/tools/valkey/valkey.go 的replaceCommandsParams函数,其核心行为与文档描述完全对应:
- 先把所有入参包装为带
$前缀的映射(paramMap := paramValues.AsMapWithDollarPrefix()),再根据parameters声明建立占位符 -> 参数类型的映射; - 逐条命令、逐段参数扫描:非占位符部分原样保留;占位符若对应
array类型,则把数组逐项展开追加(每个元素通过fmt.Sprintf("%s", item)字符串化);其他类型直接替换为对应值; - 嵌套数组只会展开一层(源码注释明确说明,例如
[A, [B, C]]展开后变为["A", "[B C]"]),避免无限递归。
替换完成后,工具调用数据源的RunCommand(ctx, commands)(internal/sources/valkey/valkey.go)执行:所有命令通过 valkey-go 的DoMulti批量发送,逐条解析响应——单条命令出错不会中断整批执行,而是把"error from executing command at index N: ..."写入该位置的输出,最终返回与命令数量等长的结果数组。这种设计保证了多命令序列的稳健性:一条失败,其余照常执行,调用方可通过索引定位失败命令。
测试与验证
仓库为该集成提供了单元测试,可作为配置写法的权威校验样例:
- internal/tools/valkey/valkey_test.go 中的
TestParseFromYamlvalkey用例,验证了kind: tool的 YAML 能正确解析为valkey.Config,其中命令支持[SET, greeting, "hello, {{.name}}"]与[GET, id]的组合,参数声明会被解析为parameters.NewStringParameter("name", "user name"); - 集成测试位于 tests/valkey/valkey_test.go,覆盖真实 Valkey 实例场景(测试目录与其余数据库集成保持一致的组织方式)。
如果你想在本地快速验证配置解析,可以参照测试用例的组织方式,用go test ./internal/tools/valkey/运行对应单元测试。
配置最佳实践与注意事项
综合官方文档与源码,落地时建议遵循以下几点:
- 敏感信息一律使用环境变量替换:
username、password等字段用${ENV_NAME}引用,避免密钥进入版本库;GCP IAM 场景下无需配置密码,凭据由运行时动态获取,安全性更高。 - 集群实例注意字段适用性:
database字段"不适用于集群(cluster enabled)实例",配置前先确认目标实例类型,集群场景直接省略该字段或保持默认。 - 用
PING自检前置:数据源初始化阶段会执行PING,地址不可达或认证失败会在启动阶段暴露,便于快速定位问题,而不是等到首次工具调用才报错。 - 命令序列保持顺序敏感:工具按配置顺序批量执行命令,适合"先写后读"这类有先后依赖的业务;但要注意
DoMulti的批量语义,若某条命令依赖上一条的返回值,应在单个工具内配置完整的命令序列,而不是依赖多次工具调用。 - 数组参数只展开一层:
array类型参数会一次展开为多个命令参数,适合SADD、DEL等多参数命令;嵌套数组不会递归展开,规划参数结构时需注意。
总结
MCP Toolbox 对 Valkey 的支持是一条"数据源 + 命令工具"的完整链路:数据源层通过 internal/sources/valkey/valkey.go 管理连接、静态密码认证与 GCP IAM 认证,并在初始化时用PING自检;工具层通过 internal/tools/valkey/valkey.go 将预定义命令与$变量动态参数结合,经DoMulti批量执行并聚合返回。参考官方文档 source.md 与 valkey-tool.md 中的 YAML 示例,结合上述字段说明与源码行为,即可快速为 MCP 客户端接入一套安全、可复用的 Valkey 操作能力。
【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考