1. 为什么要在 KingbaseES 上折腾 MCP Server
如果你正在做 AI 应用,又恰好用的是 KingbaseES(金仓数据库),大概率会遇到一个尴尬:模型能写 SQL,但你不敢让它直接连生产库。要么自己包一层 API,要么把 SQL 拼成字符串丢给数据库,安全和可维护性都很难看。
MCP(Model Context Protocol)解决的正是这件事。它把「AI 调用外部工具」标准化了,数据库操作被封装成一个个可审计、可限权的工具,模型只负责决定「调哪个工具、传什么参数」,真正执行 SQL 的是 MCP Server。KES MCP Server 就是为 KingbaseES 写的这一层服务端实现。
这篇教程的目标很明确:从零把 KES MCP Server 跑通,先给出config.toml和settings.json两份骨架配置,再用 TaoToken 的统一 Key 把 AI 工具接进来,最后用一次真实查询验证整条链路。适合已经装好 KingbaseES、想给 AI 工具加数据库能力的后端和 AI 应用开发者。全程可复制,不需要你提前理解 MCP 协议细节。
需要说明的是,MCP Server 本身不替代数据库客户端,它只是把数据库能力以工具形式暴露给 AI。真正的权限边界,仍然由你在 KingbaseES 里创建的那个专用账号决定。
2. 前置准备:TaoToken 统一 Key 与 KingbaseES 连接信息
在写配置之前,先把两样东西准备好:一个能连 KingbaseES 的数据库账号,以及一个 TaoToken 的 API Key。
数据库这边,建议不要用超级用户。新建一个只够用的账号,比如mcp_service,只给它需要的库和表的权限。这一步在后面的排障章节还会展开,因为权限不足是最高频的报错来源。
TaoToken 这边,它的作用是给 AI 工具提供统一的模型调用通道。你不需要在每台机器、每个工具里分别配不同厂商的 Key,一个 Key 走同一个 API 地址就行。对 MCP 场景来说,这意味着 AI 客户端(比如支持 MCP 的编码工具)和 MCP Server 可以共用同一套凭证体系,配置量小很多。
先拿到 Key:访问 TaoToken API Keys 管理页,创建一个 Key 并保存好。API 基础地址是https://taotoken.net/api,注意这个地址不带任何查询参数,直接填进配置即可。
注意:Key 只显示一次,创建后立刻复制到安全的地方。不要把它写进会提交到 Git 的配置文件里,用环境变量或本地
.env更稳妥。
环境依赖方面,KES MCP Server 通常以 Python 包形式分发,需要 Python 3.10 以上;AI 客户端侧如果走 Node,需要 Node 18 以上。KingbaseES 默认端口常见为 54321,请以你实际部署为准。
3. 可复制配置:config.toml 与 settings.json 骨架
这一节是全文的核心,两份配置直接抄改即可。先看服务端的config.toml。
# config.toml - KES MCP Server 服务端配置 [server] name = "kes-mcp-server" host = "127.0.0.1" port = 8080 log_level = "INFO" [database] # KingbaseES 连接信息,按实际环境修改 host = "127.0.0.1" port = 54321 dbname = "testdb" user = "mcp_service" password = "${KES_DB_PASSWORD}" # 从环境变量读取,避免明文 sslmode = "prefer" [database.pool] min_connections = 2 max_connections = 10 connection_timeout = 30 [security] # 查询安全边界 max_query_rows = 1000 query_timeout_seconds = 30 blocked_keywords = ["DROP", "TRUNCATE", "ALTER", "GRANT", "REVOKE"] require_where_on_update = true # UPDATE/DELETE 必须带 WHERE [audit] enabled = true log_queries = true log_parameters = false # 敏感参数不落盘 retention_days = 30几个关键点值得单独说。password用${KES_DB_PASSWORD}占位,启动前通过环境变量注入,这样配置文件可以放心进版本库。blocked_keywords是硬拦截,模型就算生成了DROP TABLE也会被挡在门外。require_where_on_update是我强烈建议打开的开关,它能防住「忘了写 WHERE 导致全表更新」这类事故。
再看 AI 客户端侧的settings.json,这里以常见的 MCP 客户端配置格式为例,把 TaoToken 作为模型通道、把 KES MCP Server 作为工具服务同时接进来。
{ "model": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "model": "claude-sonnet-4-5" }, "mcpServers": { "kes-database": { "command": "kes-mcp-server", "args": ["--config", "/etc/kes-mcp-server/config.toml"], "env": { "KES_DB_PASSWORD": "${KES_DB_PASSWORD}" } } } }base_url填https://taotoken.net/api,api_key用你刚才创建的 Key。mcpServers里声明了一个名为kes-database的服务,客户端启动时会自动拉起kes-mcp-server进程,并通过标准输入输出与它通信。这样模型在对话中就能「看到」数据库工具。
如果你更习惯用编码类工具做长期开发,可以把模型通道换成 TaoToken Coding Plan,它面向的就是持续编码和 Agent 场景,配合 MCP 工具链更顺。
4. 启动服务并验证请求链路
配置写好后,先导出环境变量,再启动服务。
export KES_DB_PASSWORD='你的数据库密码' export TAOTOKEN_API_KEY='你的TaoToken Key' # 前台启动,方便看日志 kes-mcp-server --config ./config.toml看到类似listening on 127.0.0.1:8080的输出,说明服务起来了。先做一次健康检查:
curl -s http://127.0.0.1:8080/health预期返回里应包含数据库连接状态,类似:
{"status":"healthy","database":"connected","version":"1.0.0"}如果database不是connected,先别急着往下走,去第 5 节对照排查。
健康检查通过后,做一次真实查询验证。这里直接调用 MCP Server 的查询接口,模拟 AI 工具发起的一次工具调用:
curl -s -X POST http://127.0.0.1:8080/query \ -H "Content-Type: application/json" \ -d '{ "sql": "SELECT id, username, email FROM users ORDER BY id LIMIT 5", "timeout": 10 }'预期返回结构大致如下,rows里是真实数据,row_count是返回行数:
{ "ok": true, "row_count": 5, "rows": [ {"id": 1, "username": "alice", "email": "alice@example.com"}, {"id": 2, "username": "bob", "email": "bob@example.com"} ], "execution_time_ms": 12 }到这一步,数据库操作链路就算通了:AI 客户端 → TaoToken 模型通道 → MCP Server → KingbaseES。你可以再故意发一条UPDATE users SET email='x'(不带 WHERE),应该会被require_where_on_update拦下并返回错误,这正好验证了安全边界生效。
想更直观地看模型如何调用这些工具,可以打开 TaoToken 模型对话,在对话里让它「查一下 users 表前 5 条」,观察它是否正确地选择了kes-database工具并传入参数。
5. 本篇常见报错排查
跑不通的时候,九成问题集中在这几类,按顺序排查效率最高。
连接被拒绝(Connection refused)。先确认 KingbaseES 在跑:systemctl status kingbase,再确认端口在听:ss -tlnp | grep 54321。如果服务正常但连不上,多半是config.toml里的 host/port 写错了,或者数据库只监听了 localhost 而你的服务在另一台机器。用ksql -h 127.0.0.1 -p 54321 -U mcp_service -d testdb手动连一次,能连上说明配置问题,连不上就是数据库侧问题。
权限不足(permission denied for table xxx)。这是最常见的。MCP Server 用的账号权限不够,去数据库里补:
GRANT CONNECT ON DATABASE testdb TO mcp_service; GRANT USAGE ON SCHEMA public TO mcp_service; GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO mcp_service; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mcp_service;注意ALL TABLES只对当前已存在的表生效,之后新建的表要重新授权,或者用ALTER DEFAULT PRIVILEGES设默认权限。
查询超时(query timeout)。先看是不是查询本身太重,用EXPLAIN ANALYZE看执行计划,缺索引就补索引。如果确实是业务需要长查询,再调大config.toml里的query_timeout_seconds,但别一上来就调到几百秒,那会掩盖真正的性能问题。
结果集被截断(result truncated)。返回行数超过max_query_rows时会被截断。正确做法是给查询加LIMIT或分页,而不是无脑调大上限。如果确实要拉大量数据做分析,考虑改成聚合查询,把行数降下来。
MCP 客户端拉不起服务。检查settings.json里command指向的可执行文件是否在 PATH 里,args里的配置文件路径是否是绝对路径。客户端日志通常会打印子进程的 stderr,那里有最直接的线索。
排查时如果怀疑是模型通道的问题,可以单独用 TaoToken 接入文档 里的示例请求测一下 API 是否通,把「模型通道」和「数据库工具」两个环节分开定位,能省很多时间。
6. 把这条链路用起来
链路跑通之后,真正有价值的是把它变成日常工具。我的建议是:先在测试库上把常用查询封装成几个固定的 MCP 工具,比如「按用户查订单」「按时间段统计销售额」,让模型调用这些语义明确的工具,而不是让它自由生成 SQL。这样既安全,结果也更稳定。
另外,config.toml里的审计日志别关。log_queries = true配合log_parameters = false,既能追溯谁在什么时候查了什么表,又不会把敏感参数写进日志。跑一段时间后翻一翻审计记录,你会对模型的实际行为有更清晰的认知,也能据此调整权限和拦截规则。
如果你打算把 MCP 用在长期编码或 Agent 工作流里,可以了解下 TaoToken Coding Plan,它和 MCP 工具链配合时,模型能持续记住上下文,减少重复配置。需要管理多个 Key 或查看用量,去 TaoToken Console 就行。整套东西的入口在 TaoToken 官网,API 地址统一用https://taotoken.net/api。