ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MCP Toolbox for Databases 的 Couchbase 数据源配置详解:从连接串到参数化 SQL 工具

2026/9/14 15:38:11 拓冰建站 浏览量
MCP Toolbox for Databases 的 Couchbase 数据源配置详解:从连接串到参数化 SQL 工具 MCP Toolbox for Databases 的 Couchbase 数据源配置详解从连接串到参数化 SQL 工具【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox在 mcp-toolbox 中接入 Couchbase 集群的核心是声明一个type: couchbase的 source再配合couchbase-sql工具执行参数化 SQL 查询。本文完整梳理 Couchbase Source 官方文档 中的连接配置、参考字段与注意事项并结合 internal/sources/couchbase/couchbase.go 与 internal/tools/couchbase/couchbase.go 的源码实现讲解每个配置项在底层如何生效帮助你从零写出可运行的 Couchbase 接入配置并理解其安全与一致性行为。Couchbase Source 的定位couchbasesource 建立与 Couchbase 集群的连接使挂载在其上的工具能够针对该集群执行 SQL 查询Couchbase 的 N1QL 查询服务默认作用域为 bucket 内的 scope。从源码看source 注册入口在 couchbase.go#L37-L41通过sources.Register(SourceType, newConfig)以couchbase类型名注册配置解析器解析成功后Initialize方法完成两件事调用createCouchbaseOptions()根据 YAML 配置构造gocb.ClusterOptions认证、TLS、连接 profile执行gocb.Connect(r.ConnectionString, opts)建立集群连接并通过cluster.Bucket(r.Bucket).Scope(r.Scope)定位到目标 scope见 couchbase.go#L73-L90。Source结构体最终只暴露一个*gocb.Scope字段外加配置本身所有工具查询都收敛到该 scope 上——这也解释了为什么bucket与scope都是必填项Couchbase 的 N1QL 查询以scope.collection为命名空间不指定它们就无法定位数据。最小可用配置示例官方文档给出的标准示例如下使用 Couchbase 官方 sample buckettravel-sample中的inventoryscopekind: source name: my-couchbase-instance type: couchbase connectionString: couchbase://localhost bucket: travel-sample scope: inventory username: Administrator password: password各字段的必填性与源码中的校验一一对应Config结构体上Name、Type、ConnectionString、Bucket、Scope都带有validate:required标签见 couchbase.go#L51-L67。单元测试 couchbase_test.go#L106-L152 验证了两类解析失败场景缺失必填字段如省略connectionString会触发Field validation for ConnectionString failed on the required tag错误出现未定义字段如foo: bar会因 YAML 严格模式报unknown field foo配置解析失败。这意味着 mcp-toolbox 对 source 配置是零容忍的写错字段名会直接让服务启动失败而不是静默忽略。完整字段参考表以下参考表继承自 source.md并补充了源码层面的行为说明字段类型必填说明typestringtrue必须为couchbase。connectionStringstringtrueCouchbase 集群连接串如couchbase://localhost、couchbases://host1:18018,host2:18018。bucketstringtrue要连接的 bucket 名称。scopestringtruebucket 内的 scope 名称如_default。usernamestringfalse认证用户名。passwordstringfalse认证密码。clientCertstringfalse客户端证书文件路径TLS 双向认证。clientCertPasswordstringfalse客户端证书密码。clientKeystringfalse客户端密钥文件路径。clientKeyPasswordstringfalse客户端密钥密码。caCertstringfalseCA 证书文件路径。noSslVerifybooleanfalse为 true 时跳过服务端证书校验。警告仅可用于开发/测试环境生产环境禁用否则连接存在中间人攻击风险。profilestringfalse要应用的连接 profile 名称如serverless。queryScanConsistencyintegerfalse索引扫描一致性级别。1not_bounded最快但结果可能不含最新写入2request_plus最高一致性包含查询开始前的所有已提交操作但有性能开销。不指定时使用 Couchbase Go SDK 的默认值。TLS 与认证配置在源码中的实现createCouchbaseOptions()couchbase.go#L140-L211展示了各 TLS 字段的组装逻辑理解它有助于正确使用证书相关字段用户名/密码认证只要username非空就构造gocb.PasswordAuthenticator并设为cbOpts.Authenticator。证书认证clientCert、clientKey、caCert三个路径会被os.ReadFile读入内存任一文件读取失败都会使 source 初始化失败随后交给tlsutil.NewConfig生成 TLS 配置若clientCert已设置认证器替换为gocb.CertificateAuthenticatorX.509 证书认证。信任锚caCert提供后SecurityConfig.TLSRootCAs指向该 CA 池noSslVerify为 true 时则设置TLSSkipVerify。注意源码中仅当clientCert或caCert至少有一个非空时才走 TLS 解析分支couchbase.go#L172-L203。证书/密钥密码getCertKeyPassword的取舍规则是——clientKeyPassword非空时优先使用它否则回退到clientCertPasswordcouchbase.go#L213-L220。因此当证书与密钥共用同一密码时只填clientCertPassword即可。一个完整的 TLS 配置示例取自 couchbase_test.go#L58-L91 的测试用例kind: source name: my-couchbase-instance type: couchbase connectionString: couchbases://localhost bucket: travel-sample scope: inventory clientCert: /path/to/cert.pem clientKey: /path/to/key.pem clientCertPassword: password clientKeyPassword: password caCert: /path/to/ca.pem noSslVerify: false queryScanConsistency: 2关于连接串中的多节点备选地址与自定义端口官方文档提示可参考 Couchbase Go SDK 的 Managing Connections 指南Couchbase 官方文档此处不附外链mcp-toolbox 侧直接将connectionString原样透传给gocb.Connect因此 SDK 支持的一切地址格式多主机、备地址、自定义端口在此均适用。profile连接性能档位profile字段最终调用cbOpts.ApplyProfile(gocb.ClusterConfigProfile(r.Profile))couchbase.go#L204-L209。这是 Go SDK 提供的连接配置档位如serverless用于按部署环境本地开发、云、Serverless调整重连、连接池等参数不指定时使用 SDK 默认。queryScanConsistency一致性换性能该字段在RunSQL中直接映射为gocb.QueryOptions.ScanConsistencycouchbase.go#L119-L123results, err : s.CouchbaseScope().Query(statement, gocb.QueryOptions{ ScanConsistency: gocb.QueryScanConsistency(s.CouchbaseQueryScanConsistency()), NamedParameters: params.AsMap(), })设为1not_bounded允许索引扫描读取未提交/未同步的条目最快适合对实时性不敏感的探索性查询设为2request_plus保证扫描到查询发起前已提交且已向主节点请求过的所有操作适合要求读到最近写入的场景不设置透传 Go SDK 默认值SDK 默认为 request_plus 语义的自动级别。仓库的集成测试在testcontainers启动的 Couchbase 容器上固定使用queryScanConsistency: 2见 tests/couchbase/couchbase_integration_test.go 的getCouchbaseVars可以作为可复现的参考配置。与 Source 配套的工具couchbase-sqlsource 声明连接工具声明能做什么。mcp-toolbox 中面向 Couchbase 的工具是couchbase-sql完整文档见 couchbase-sql.md。它执行一条预定义的 SQL 语句且以参数化语句方式运行语句中的$name占位符会被同名参数替换。工具配置参考表来自 couchbase-sql.md字段类型必填说明typestringtrue必须为couchbase-sql。sourcestringtrue工具所执行的 source 名称。descriptionstringtrue传递给 LLM 的工具描述。statementstringtrue要执行的 SQL 语句。parameters参数列表false与 SQL 语句配合使用的命名参数。templateParameters参数列表false在执行前直接插入 SQL 语句的模板参数。authRequiredarray[string]false使用该工具所需的服务端认证服务列表。基础参数示例来自官方文档kind: tool name: search_products_by_category type: couchbase-sql source: my-couchbase-instance statement: | SELECT p.name, p.price, p.description FROM products p WHERE p.category $category AND p.price $max_price ORDER BY p.price DESC LIMIT 10 description: | Use this tool to get a list of products for a specific category under a maximum price. Takes a category name, e.g. Electronics and a maximum price e.g 500 and returns a list of product names, prices, and descriptions. Do NOT use this tool with invalid category names. Do NOT guess a category name, Do NOT guess a price. Example: { category: Electronics, max_price: 500 } parameters: - name: category type: string description: Product category name - name: max_price type: integer description: Maximum price (positive integer)注意description的写法它同时面向 LLM 说明参数边界不要猜 category 或 price这种约束性描述能显著降低模型生成越界调用的概率值得在自定义工具时借鉴。源码视角参数化查询如何防注入工具侧的执行链路在 internal/tools/couchbase/couchbase.go#L109-L130 的Invoke方法中分三步parameters.ResolveTemplateParams(...)先对statement做 Go template 渲染处理templateParametersparameters.GetParams(...)从 LLM 传入的参数值中提取parameters声明的命名参数source.RunSQL(newStatement, newParams)将最终语句与NamedParameters一并交给 Couchbase 查询引擎由引擎完成参数绑定。由于parameters走的是数据库侧的命名参数绑定gocb.QueryOptions.NamedParameters参数值永远不会被拼进 SQL 文本这是防注入的根本保证。而templateParameters则相反——它允许把值直接插入语句文本包括表名、列名等标识符位置官方工具文档 明确警告这会使语句更易受 SQL 注入影响出于性能与安全考虑推荐只使用基础 parameters。相关参数机制的完整定义含escape等字段见 工具配置文档。工具还会在ValidateSource中校验 source 是否实现了compatibleSource接口要求提供CouchbaseScope()与RunSQL见 couchbase.go#L46-L49因此只有couchbase类型的 source 能被couchbase-sql工具使用配置错配会在启动阶段报错而非运行期才暴露。结果如何返回RunSQLcouchbase.go#L119-L138将每行结果以json.RawMessage原样收集为[]any返回即工具输出是一个 JSON 数组每个元素是一行 Couchbase 查询结果。这意味着 MCP 客户端如 Gemini CLI、Claude拿到的就是与 N1QL 查询服务一致的 JSON 行集无需二次转换。端到端验证方式仓库为这条链路提供了两级测试可作参考配置解析单测internal/sources/couchbase/couchbase_test.go 验证基础配置与 TLS 配置的 YAML 解析以及未知字段、缺失必填字段的报错信息internal/tools/couchbase/couchbase_test.go 验证couchbase-sql工具含 templateParameters 混合场景的解析结果集成测试tests/couchbase/couchbase_integration_test.go 通过 testcontainers 拉起真实 Couchbase 集群默认_defaultscope、test-bucket、Administrator账号跑通 source couchbase-sql工具的实际查询。阅读这两个测试文件可以快速复制一份最小验证配置connectionString指向容器地址、scope: _default、queryScanConsistency: 2。小结一个type: couchbase的 source 由connectionStringbucketscope三要素定位数据认证支持用户名/密码与 X.509 证书两种方式noSslVerify仅限开发环境使用queryScanConsistency是显式的一致性/性能权衡开关1 not_bounded2 request_plus缺省交给 Go SDK 默认值工具侧统一使用couchbase-sqlparameters走引擎侧命名参数绑定防注入templateParameters直接改写语句文本灵活但有注入风险生产配置优先只用前者所有字段行为均可在 internal/sources/couchbase/couchbase.go 与 internal/tools/couchbase/couchbase.go 中逐行核对出错时结合 couchbase_test.go 中的报错样例可快速定位配置问题。【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考