【金仓数据库征文】让 AI 直接读懂你的金仓:基于 KES MCP Server 的自然语言数据库助手实战(Trae + DeepSeek)

发布时间:2026/8/6 6:27:36
【金仓数据库征文】让 AI 直接读懂你的金仓:基于 KES MCP Server 的自然语言数据库助手实战(Trae + DeepSeek) 环境说明Windows Trae KES MCP Server DeepSeekOpenAI 兼容 API后端连 KingbaseES V9端口 54321文章目录一、平时写代码经常遇到的一个情况二、KES MCP Server 到底是什么先说一下原理三、环境准备给 AI 一个「只读的沙盒」四、安装 KES MCP Server五、在 Trae 中配置 MCP保存即自动加载 9 个工具建一个「智能体」让工具真正被调用六、实战一用自然语言探索库结构七、实战二用自然语言查询业务数据八、实战三一句话给数据库做健康体检九、实战四Restricted 模式的安全边界——删数据被拦下十、体验总结它是助手不是 DBA 替身一、平时写代码经常遇到的一个情况先讲一个我几乎天天都会碰到的情况。写业务代码的时候有时候我想确认一下一张表的字段类型是什么。我得切到数据库客户端里面去。先找库再找 schema然后双击表。看半天字段和约束。那如果我想知道某条查询为什么慢呢又要去复制建表语句。还得拉出索引清单跑一下执行计划。接着把这堆信息拷回 IDE 里面粘进 AI 对话框。让大模型帮忙分析。一次排查弄下来鼠标在 IDE、数据库客户端、AI 网页这三个窗口之间来回点点个七八次是很常见的情况。更别扭的情况其实还有。我喂给 ChatGPT 的那些表结构和执行计划全是我手工搬运过来的静态文本。AI 看到的其实不是真实的库。它看到的就是我复制下来的那点文本。它给的建议听着好像是对的。但是呢一旦我漏贴了某个索引或者线上的表结构其实早就改过了。它给出的结果就是错的。信息这样搬来搬去效率很低而且特别容易出现信息丢失的情况。于是我就一直琢磨一个问题。有没有这种可能呢就是我直接在写代码的 IDE 里面问一句orders 表有哪些字段和索引或者帮我看看这个库健不健康。然后 AI 就能基于真实的、当前的数据库环境来回答我。而不是靠我自己手动去复制文本给它。让我比较意外的是金仓官方其实已经把这个东西做出来了。也就是KES MCP Server。这篇文章的话我就带着你在 Trae 里面把它跑起来。完整体验一下用自然语言去操作金仓数据库的过程。看完这篇文章你能拿到一套可以直接用的部署配置。还有四个真实场景的操作例子。以及几个一次性就能写对的关键配置要点。二、KES MCP Server 到底是什么先说一下原理要玩明白它的话得先搞懂 MCP 是什么意思。MCPModel Context Protocol模型上下文协议它其实就是一套协议。这套协议是用来让大模型跟外部工具或者数据源进行标准化对接的。以前的情况是什么样的呢。每个应用如果想让自己的能力被 AI 调用都得自己单独写一套对接的代码。有了 MCP 之后呢大家都遵循同一套标准格式。AI 客户端就可以直接去发现并调用任何 MCP Server 暴露出来的能力了。它跑起来的链路其实是这样的我在 Trae 里面用自然语言提问Trae 这个时候是作为 MCP Client 的。它会先去问 Server 有哪些工具每个工具要什么参数。然后把这些工具清单还有我的问题一起交给后面的大模型大模型拿到之后会去判断该调哪个工具参数填什么。接着生成一次工具调用的请求KES MCP Server 收到这个请求。它先做参数校验和访问控制。做完这些之后再用它自己持有的数据库连接去 KES 里面执行数据库把结果返回来。经过 Server 回传给大模型。大模型整理一下用人话讲给我听。这里有一个最关键的地方也是特别容易被忽略的。那就是开发工具永远不会绕过 MCP Server 直连数据库。AI 手里是没有数据库连接串的。它能做的事情往往仅仅只是请求 Server 帮忙执行某个工具而已。这其实就带出了一个问题。为什么非要中间夹这一层呢为什么不让 AI 直接连库原因其实就在于安全。如果让大模型直接拿着数据库连接。它生成的任何 SQL 都会被直接执行出去。比如你说删掉所有测试数据它要是理解偏了那就是线上的生产事故了。中间加上 MCP Server 这一层呢就是用来做限制的。它会对 SQL 做类型白名单的校验。碰到高危的写操作会直接拦截。能访问什么能力也是限定好的。AI 负责理解你的意图Server 负责把关执行。这两件事是分开的。如果从分层的角度来看的话。整条链路大概可以分成五层开发工具→ 大模型→ MCP 协议层 → KES MCP Server校验与访问控制→ KingbaseES 数据库。AI 能做的事情就是被这样一层一层收窄的。它对外一共暴露了9 个标准工具。我按照它们能干的事情分成了四类结构探索list_schemas用来列 schema、list_objects用来列表、视图这些对象、get_object_details看某个对象具体的字段、约束还有索引详情的情况查询与计划execute_sql执行查询、explain_query看执行计划运维诊断analyze_db_health做 7 个维度的健康检查、get_top_queries基于sys_stat_statements查出 Top N 的慢查询索引优化analyze_workload_indexes、analyze_query_indexes用来给索引提建议这篇文章主要就是体验一下前三类的自然语言操作。索引优化那两个工具的话背后其实是一整套深度调优的方法。这个不是这篇文章的重点。传输方式的话它支持Stdio这个本地开发比较推荐因为不需要开端口。还支持SSE和Streamable HTTP后面这两个是面向远程的情况。安全方面它分了两种模式restrictedSQL 白名单、拦截高危写操作演示或者生产环境都强烈推荐用这个和unrestricted全权限要慎用。我这篇文章里面全程都是用restricted模式的。三、环境准备给 AI 一个「只读的沙盒」先别急着敲代码。准备环境这步得先做。我单独建了一个演示库ai_demo。跟别的项目隔离开来的。这种情况下面就算 AI 出了什么错别的数据也不会受影响。1建演示库、造点业务数据。建表的话我弄了个orders表。接着就是造数据。用generate_series去生成 5000 行随机数据其实就是用来模拟平时业务里那些订单的CREATEDATABASEai_demo;\c ai_demoCREATETABLEorders(idserialPRIMARYKEY,user_idint,productvarchar(64),amountnumeric(10,2),statusvarchar(16),created_attimestampDEFAULTnow());INSERTINTOorders(user_id,product,amount,status)SELECT(random()*1000)::int,(ARRAY[平板电脑T10,智能手表Pro,显示器27寸,空气净化器A5,无线耳机X1])[floor(random()*51)],round((random()*3000)::numeric,2),(ARRAY[pending,paid,done])[floor(random()*31)]FROMgenerate_series(1,5000);2为 AI 建一个最小权限账号ai_reader。这一步其实是我觉得最不能省的。官方文档里也特意提了这个。MCP Server 它能管一些事情。但真要说防住问题靠的还是数据库账号权限本身。白名单如果出了漏洞被绕过了怎么办只要这个账号是只读的也就是说没有任何写权限。那么 AI 就算想删数据或者改数据也是做不到的。安全这东西不能只靠一个地方去拦得多弄几道关卡CREATEUSERai_readerWITHPASSWORD强密码;GRANTCONNECTONDATABASEai_demoTOai_reader;GRANTUSAGEONSCHEMApublicTOai_reader;GRANTSELECTONALLTABLESINSCHEMApublicTOai_reader;-- 为运维诊断工具补一组「只读监控」权限全是读权限、零写GRANTsys_monitorTOai_reader;-- 读系统监控视图含慢查询 SQL 文本GRANTUSAGEONSCHEMAsys_hmTOai_reader;-- 健康体检用到的 sys_hm 模式GRANTEXECUTEONALLFUNCTIONSINSCHEMAsys_hmTOai_reader;GRANTSELECT,USAGEONALLSEQUENCESINSCHEMApublicTOai_reader;-- 序列健康检查后面那四条代码我多解释一下。像analyze_db_health还有get_top_queries这些东西它们是运维诊断用的。它们得去读系统的监控视图还得读sys_hm模式序列信息也要看。光给表的SELECT权限是不够用的。所以得额外补一组只读监控权限。sys_monitor这个东西它是金仓里面自带的一个只读监控角色。如果你用的版本里这个角色名字不一样那你换成你自己版本里的只读角色就行了。但这里有个重点。那就是它们全是读权限、不含任何写。最小权限的核心并没有变AI 还是改不了数据也删不了数据。给 AI 分配权限的话我就认死一个理够用就好能少给就少给。这次对接的所谓第三方其实也就是个大模型而已。3装上假设索引扩展sys_hypo。explain_query这个功能它是用来模拟情况的。模拟什么呢就是假如你建了某个索引情况会变成什么样。这个时候就会用到这个扩展。另外慢查询需要用的sys_stat_statements这个的话我库里其实已经装好了CREATEEXTENSIONIFNOTEXISTSsys_hypo;四、安装 KES MCP Server前置条件Python3.12–3.13、包管理器uv、Trae。金仓要求 KESV8R6 及以上我的 V9R1C10 满足。整个安装分三步走一步一步来uv比传统pip venv舒服不少。1先装好uv。Windows 下用官方一键脚本最省事在 PowerShell 里执行powershell-cirm https://astral.sh/uv/install.ps1 | iex装完uv会落在C:\Users\你的用户名\.local\bin脚本会提示把这个目录加进PATH。这里有个小细节装完要新开一个终端窗口PATH才会生效。新窗口里用uv --version能打印版本号就说明uv就位了。2克隆仓库、建环境、装依赖。仓库 clone 到任意一个工作目录即可最好跟金仓的安装目录分开互不干扰。装之前先用uv venv建一个项目专属的虚拟环境再把项目装进去gitclone https://gitee.com/king-db/kingbase-mcpcdkingbase-mcp uv venv# 建项目专属虚拟环境 .venvuv pipinstall.# 把 kingbase-mcp 及其依赖装进该环境为什么要先uv venvuv pip install需要一个明确的目标环境它不会默认往系统 Python 里装东西。先建好.venv依赖就全隔离在项目目录里不污染全局 Python后面uv run也会自动认这个.venv。3手动起一次确认能连通。正式使用时连接串由下一节的 Trae 通过环境变量注入想在命令行先验证一把临时设好DATABASE_URI再运行即可ai_reader就是第三章建的那个最小权限账号setDATABASE_URIkingbase://ai_reader:你的密码服务器IP:54321/ai_demo uv run kingbase-mcp --access-mode restricted终端依次打印出Starting KingbaseES MCP Server in RESTRICTED mode和Successfully connected to database and initialized connection pool就说明依赖装好、也成功连上了金仓Windows 下会附带一句Signal handling not supported on Windows是平台差异、不影响使用CtrlC退出即可。五、在 Trae 中配置 MCP保存即自动加载 9 个工具打开 Trae 的 MCP 管理面板手动添加一段 JSON。要点有三command用uv--directory指向刚 clone 的仓库绝对路径DATABASE_URI填演示库和最小权限账号ai_reader访问模式锁死restricted{mcpServers:{kingbase-mcp:{command:uv,args:[--directory,F:\\CodeDir\\mcp\\kingbase-mcp,run,kingbase-mcp,--access-mode,restricted],env:{DATABASE_URI:kingbase://ai_reader:强密码服务器IP:54321/ai_demo}}}}填写提醒强密码、服务器IP是占位符替换时要连同尖括号一起去掉只留真实值。要是把留在串里它们会被当成密码和主机名的一部分直接导致连接失败。保存的一瞬间就能感受到 MCP 的「即插即用」kingbase-mcp亮起绿灯展开它前面讲的9 个工具被自动加载列了出来——我没写一行对接代码Trae 就完成了「工具发现」。这正是第二节说的Client 向 Server 问一句「你有啥能力」剩下的全自动。建一个「智能体」让工具真正被调用工具加载出来还差最后一步在 Trae 里MCP 工具不是在普通对话里直接就能用的得先挂到一个智能体Agent上。进入「智能体 → 创建智能体」给它起个名字我叫「KES 中间服务代理」在下方工具区把kingbase-mcp勾上保存。之后在对话框用选中这个智能体它就能按需调用那 9 个工具了对话模型我接的是 DeepSeek任意 OpenAI 兼容 API 都行。配置要点--directory的路径写法。这段 JSON 里最需要留意的就是--directory的值两点写对就能一次亮绿灯一是填绝对路径如F:\CodeDir\mcp\kingbase-mcpTrae 会以它为工作目录拉起子进程相对路径容易定位不到项目二是 Windows 路径的反斜杠在 JSON 里要双写\\单个\会被 JSON 转义吃掉。填对这两点保存后kingbase-mcp立刻亮起绿灯。MCP 面板还能查看子进程 stderr 日志是核对配置的好帮手。六、实战一用自然语言探索库结构前面的配置弄完没问题的话我们就可以开始试了。我当时是在 Trae 那个对话框里直接敲了这行字列出 public schema 下所有的表。它知道我想干嘛然后就去调了list_objects最后把真实的表单给列出来了。这中间有个细节。我在 Trae 界面上能清清楚楚看到一行提示写着「正在调用 kingbase-mcp / list_objects」。这个事情很关键它不是凭记忆编的是真去库里查的。接着我又问了一句查看 orders 表的字段、约束和索引。这回它换了个方法调的是get_object_details。它把字段类型还有约束、索引这些信息分开了列出来orders的主键在这里头是以orders_pkey索引的样子放在了「索引」这一栏里面的这些东西直接来自当前 KES 实例我根本不用提前去把建表语句给复制过来贴进去。那么到底省了哪些事呢要是按以前的习惯我得先把窗口切到数据库客户端那边。然后一级一级去点开。点完还得手动敲一个\d orders。现在就是一句话的事。表结构直接就显示在我写代码的这个界面里了。其实这种只用一句话就能搞定的感觉到这一步就已经有了。七、实战二用自然语言查询业务数据看表结构其实只是个开头。我们平时干活查数据才是最经常干的事。我一行 SQL 都没写就是直接把需求打字说出来查询本月销售额排名前 5 的商品。它把我们说的话转成了 SQL。具体怎么转的呢它先按product去做了分组。然后用了SUM(amount)算总和。接着它用date_trunc(month, created_at) date_trunc(month, current_date)把时间范围框在了「本月」也就是说按自然月来算的。最后加上了ORDER BY total_sales DESC LIMIT 5。这些代码通过execute_sql在金仓里面跑了起来。跑完之后它把结果给整理成了表格的样子给我看。这次它把写出来的 SQL 还有那 Top 5 的结果一起放在了那儿。看得很清楚。不过这里我要多嘴说一句。这也是我自己平时一直保持的一个习惯AI 生成的 SQL 一定要人工核对。你仔细想想它说的「本月」到底是指自然月呢还是往前推30天的那种滚动月份还有这个金额要不要把订单状态给区分开比如那些没支付的pending状态的订单到底算不算在销售额里面这些业务上的细节模型往往是仅仅只是靠猜的。我个人的话一般会要求它把生成的 SQL 一并贴出来。我自己先扫一眼里头的逻辑然后再去看它返回的结果。用起来是挺方便的但是绝对不能直接就信了。八、实战三一句话给数据库做健康体检如果是运维那种情况的话MCP 的用处就更明显了。我当时敲了这句检查一下数据库的健康状况。它去调用了analyze_db_health。它从缓冲还有缓存、索引、连接、序列与约束、主从复制、Vacuum 这些多个维度去做了检查。最后给我返回了一份有格式的报告。我实际测下来这个库整体给出的结论是「良好」。缓冲命中的数据挺好看的。索引缓存命中率有99.8%。表缓存命中率是99.0%。这两个数字都远远超出了 95% 那个健康及格线。这就说明大部分数据直接从内存里就能读到。另外索引这边也没有出现什么失效的、重复的或者膨胀没用的。连接、序列、约束这些也全都在正常的情况里。不过它还标了一个值得关注的地方。它说系统表sys_catalog._kingbase_loginfo那里有个事务 ID 回卷Wraparound的提示。这个得注意一下这是系统内部表。并不是我们自己的业务表。通常来说这种情况是由数据库自己去维护的。但是连这种系统底下的隐患都能扫出来说明它确实是在认真查。要搁在以前这些指标得靠自己写一堆系统视图的查询语句然后手动拼到一起。现在就是一句话的事体检单就出来了。查完这些我顺手又让它去把耗时间长的查询找出来找出最近总耗时最高的 5 条 SQL。这一步它用的是get_top_queries。它底下靠的是之前装好的sys_stat_statements这个插件会把整个实例的 SQL 执行统计给记下来。它把总耗时排在最前面的 5 条给拉出来了。每条里面都带着总耗时、执行次数、平均耗时、返回行数和 SQL 原文。我实际看到排在前面的是ANALYZE还有CREATE INDEX这种维护或者叫 DDL 的操作。这种操作只跑一次耗时多一点也是正常的。排在后面的才是SELECT * FROM ... WHERE ...这种我们写的业务查询。时间到底花在哪了看一眼就知道了。如果在这里头发现了有问题的 SQL按理说是可以接着让它跑一下explain_query去看执行计划的。但是呢执行计划怎么读、索引怎么调、参数怎么设那是一整套 DBA 的深度活儿不在本文范围。我这里想说的其实就是那个使用感受。从脑子里想做个体检到最后拿到这份体检单。中间完全不用去切换任何别的窗口。九、实战四Restricted 模式的安全边界——删数据被拦下数据库这东西在企业层级里是很底层的设施。肯定不能让 AI 随便去操作。前面我提了好几次的安全设计。这一节我们就来测测到底有没有用。我整个过程都是开着restricted模式的。这个模式里面有个 SQL 类型的白名单。遇到那种危险的写操作它就会给拦住。我当时故意让它去干一件有风险的事把 orders 表里 status 为 pending 的订单都删掉。在restricted模式下这种写入或者删除的操作直接就被挡住了。这个请求根本没有机会碰到数据库。这就是第二节里说的那个控制机制在起作用。退一步讲就算这层没拦住。我们用的ai_reader这个账号它全都是只读的权限。就连监控那些也是只能读不能写。那么到了数据库那一层一样会把请求拒绝掉。Server 白名单 账号最小权限双保险叠加。只有做到这样我才敢把一个大模型接到我自己的库上去。实际测下来这句删除的话刚发出去就被拦了。AI 返回了「请求已被拒绝」这几个字。并且给了一段审计的信息。里面写着操作类型是DELETE。目标对象是public.orders。拦截的原因写的是「未授权的访问尝试」。后面还写得很清楚说「当前配置的系统权限和 MCP 数据库接口execute_sql仅允许执行只读操作禁止通过此通道执行DELETE/UPDATE/INSERT等修改或删除数据的写操作」。也就是说请求根本没落到数据上。orders表里面一行数据都没少。十、体验总结它是助手不是 DBA 替身这么一整圈搞下来。我最直接的一个感觉就是排查数据库问题不用再在 IDE 和客户端之间来回切了。不管你是要看表结构、查业务数据还是看健康情况。只要打一句人说的话就能拿到。而且这些答案全都是从真实的金仓实例里出来的。我们可以回想一下开头说的那个对比。老做法是「手工在客户端查结构复制粘贴给 ChatGPT 分析」。这两个做法最大的区别其实不在于你省去了几次复制粘贴的动作。区别在于另外一点。在老做法里面AI 看到的东西是我手动搬过去的。那些东西很有可能是过期的或者是不全的静态快照。但是用了 KES MCP Server 之后呢AI 面对的就是当前真实、完整、实时的库环境。它查出来是什么就是什么。不会因为我自己漏贴了一个索引它就分析错了。这个变化是很实在的。适合谁那些平时经常要查库、排查 SQL 问题的开发人员。还有一些想要把数据库操作门槛给降下来的团队。要注意什么在演示或者生产环境里面一定要开restricted模式然后配上最小权限的账号。另外explain_query这个功能需要用到sys_hypo。慢查询分析得靠sys_stat_statements。在用之前记得先把这些给装好。如果是本地开发的话优先去用 Stdio 传输。它的边界AI 生成的 SQL 还是得靠人去对一下业务口径这个在实战二里面已经说过了。那些比较复杂的深度调优比如执行计划分析啊、索引体系怎么弄啊、参数怎么调啊这些活还是得 DBA 来干。MCP 其实更像是一个「能读懂你数据库的助手」。它帮你把那些繁琐的查询和探索用一句话给弄完。它并不能去代替 DBA 做出专业的判断。从「数据库替代」到「让 AI 直接读懂数据库」KES MCP Server 让金仓在 AI 时代的开发体验上又往前走了一步。这大概就是「不止于替代」最具体、也最好玩的一种样子。