最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Database Query MCP Server 如何只读查询 MySQL、PostgreSQL、MSSQL 和 Oracle?
时间:2026-09-13 11:40:01 编辑:袖梨 来源:一聚教程网
Database Query MCP Server 对应的工具包是 @xuejike/develop-tool,它为 MySQL、PostgreSQL、Microsoft SQL Server 和 Oracle 分别提供只读查询工具。每种工具接收主机、端口、用户名、密码、数据库名和 SQL,只允许 SELECT、SHOW、DESCRIBE、EXPLAIN 等读取操作,并阻断 INSERT、UPDATE、DELETE、DROP 等修改语句。
工具可以直接接收连接参数,也可以使用预先保存的连接别名,或从项目中的环境文件、Spring Boot application-dev.yaml 等配置读取数据库信息。连接密码和 Token 可以使用 AES-256-GCM 加密保存,配置文件权限设为 0600,还支持从标准输入读取密码以避免写入 shell 历史。
需要注意,develop-tool 不只是数据库 MCP。它还支持 Loki、Elasticsearch 和 Jenkins,其中 Jenkins 工具可以触发构建,属于有副作用操作。因此“数据库查询只读”不能等同于“整个 MCP Server 只读”。生产部署应按用途拆分客户端、账户和可用工具。
四个数据库查询工具
query_mysql 用于 MySQL,query_postgresql 用于 PostgreSQL,query_mssql 用于 SQL Server,query_oracle 用于 Oracle。四个工具的参数结构相似,但连接驱动、端口、数据库名语义和只读 SQL 方言不同。
模型应根据数据库类型选择对应工具,不能把 MySQL 的 SHOW、PostgreSQL 的系统目录或 SQL Server 的 TOP 语法直接用于其他数据库。
工具注解声明 readOnlyHint=true 和 destructiveHint=false,有助于客户端展示风险,但注解只是元数据。真正的安全依赖 SQL 验证和数据库账户权限。
允许哪些 SQL
项目说明允许 SELECT、SHOW、DESCRIBE、EXPLAIN 等只读操作。SELECT 返回业务数据,SHOW 查看数据库状态或配置,DESCRIBE 查看结构,EXPLAIN 分析执行计划。
不同数据库对只读语句的定义并不完全相同。某些函数、过程、扩展或 SELECT 表达式可能产生副作用,SHOW 也可能暴露敏感配置。
应用层白名单应按驱动分别测试,数据库账户必须只具备读取权限。不能仅凭 SQL 开头判断安全。
阻断哪些写操作
项目会拦截 INSERT、UPDATE、DELETE、DROP 等常见写入和 DDL。部署者还应测试 CREATE、ALTER、TRUNCATE、MERGE、GRANT、REVOKE、CALL、EXEC 和多语句批次。
注释、大小写、空白、CTE 和字符串可能影响简键词检测。安全测试要覆盖每个数据库方言,而不是只测一条 DELETE。
即使过滤器漏判,专用只读用户也应在数据库执行层拒绝。应用阻断负责快速反馈,数据库授权负责最终边界。
安装方式
可以全局安装 npm 包:
npm install -g @xuejike/develop-tool
也可以通过 npx 临时运行:
npx @xuejike/develop-tool
生产环境应固定版本和完整性信息,不使用每次启动都可能变化的浮动版本。安装前审查依赖与生命周期脚本。
配置为 MCP Server
最小客户端配置使用 npx 启动:
{
"mcpServers": {
"develop-tool": {
"command": "npx",
"args": ["@xuejike/develop-tool"]
}
}
}
这会同时暴露包中启用的数据库、日志和 Jenkins 工具。高安全环境应检查是否能限制工具集,或使用独立包装配置只开放数据库查询。
客户端配置不能包含明文生产密码。连接信息通过受控别名或秘密注入,并限制配置文件权限。
直接参数模式
四个数据库 MCP 工具都可以在每次调用中提供 host、port、user、pwd、db 和 querySql。
直接参数便于临时测试,但密码会进入 MCP 请求、模型工具参数、客户端日志和调试记录。生产环境不应让模型生成或查看数据库密码。
优先预配置别名,让工具调用只传 alias 和查询。服务端再从受保护配置读取凭据。
连接别名模式
CLI 可以保存连接:
develop-tool config add reporting
--type postgresql
--host db.internal
--port 5432
--user mcp_reader
--password-stdin
--database reporting
--global
之后查询只需引用别名:
develop-tool query --alias reporting -q "SELECT id, status FROM jobs LIMIT 5"
别名应包含环境和权限,例如 prod-report-reader,而不是 prod。执行前让 Agent 回报解析到的数据库类型与目标。
用户级和项目级配置
用户级配置位于用户目录的 .develop-tool/config.json,适合跨项目共享;项目级配置位于项目根目录 .develop-tool.json,优先级高于用户级。
项目级优先便于仓库使用专用连接,也可能被恶意或误提交文件覆盖全局别名。打开不可信仓库前检查配置。
.develop-tool.json 应加入 .gitignore。即使密码已加密,主机名、用户名、数据库和密文仍不应公开。
自动读取项目配置的风险
工具可以读取 .env、YAML 和 Spring Boot application-dev.yaml 等项目配置,减少手工输入。
自动发现也会扩大读取范围。配置中可能包含生产密码、云密钥和其他服务凭据,不应把整个文件发送给模型。
只解析需要的数据库字段,在本地完成,不打印明文。对不可信仓库关闭自动读取,改用受控别名。
AES-256-GCM 加密存储
项目说明密码和 Token 使用 AES-256-GCM 加密,密钥通过本机用户信息派生,配置文件权限设置为 0600。
GCM 同时提供机密性和完整性,可发现密文篡改。但从本机用户信息派生意味着同一用户环境被攻破后,攻击者可能同时获得密文与派生条件。
这种加密适合降低配置文件意外泄露风险,不应替代操作系统账户隔离、磁盘加密和外部秘密管理器。
使用 password-stdin
添加配置时使用 --password-stdin,可以避免密码直接出现在命令参数和 shell 历史。
标准输入仍可能被终端录制、自动化日志或恶意进程截获。不要在共享终端和直播环境输入生产凭据。
完成后检查历史、进程列表与配置权限。已经在命令行暴露的密码应立即轮换。
MySQL 只读账户
为 MCP 创建独立用户,只授予目标数据库或脱敏视图 SELECT 与必要 SHOW VIEW。
CREATE USER 'mcp_reader'@'app-host' IDENTIFIED BY 'replace-with-secret';
GRANT SELECT, SHOW VIEW ON reporting.* TO 'mcp_reader'@'app-host';
不授予 FILE、PROCESS、SUPER、CREATE、ALTER、DROP 或写权限,并限制来源主机和 TLS。
PostgreSQL 只读账户
创建登录角色,授予数据库 CONNECT、目标 schema USAGE 和对象 SELECT。
GRANT CONNECT ON DATABASE reporting TO mcp_reader;
GRANT USAGE ON SCHEMA reports TO mcp_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA reports TO mcp_reader;
配置 future table 默认权限,并可设置 default_transaction_read_only。不要授予 schema CREATE 或超级用户。
SQL Server 只读账户
创建专用登录和数据库用户,加入 db_datareader,或使用更窄的自定义角色。
CREATE USER mcp_reader FOR LOGIN mcp_reader;
ALTER ROLE db_datareader ADD MEMBER mcp_reader;
不加入 db_owner、db_datawriter 或 sysadmin。需要元数据时按对象授予 VIEW DEFINITION。
Oracle 只读账户
创建专用用户,只授予 CREATE SESSION 和目标对象 SELECT。
GRANT CREATE SESSION TO mcp_reader;
GRANT SELECT ON app.orders TO mcp_reader;
不授予 DBA、ANY 权限或通用 PL/SQL EXECUTE。敏感数据通过视图脱敏。
为什么数据库级只读仍是必要条件
SQL 验证器可能遗漏方言语法、函数副作用、过程调用或编码绕过。依赖升级也可能改变解析。
专用只读用户让数据库引擎在最终执行时拒绝修改。即使应用层被绕过,攻击者仍缺少写权限。
上线测试要用同一凭据绕过 MCP 直接尝试写入,确认数据库拒绝,而不只是看工具返回“只读”。
查询结果和行数控制
数据库结果可能包含个人信息、令牌、密码哈希和商业数据。查询只选择必要列并使用 LIMIT、TOP 或方言对应限制。
项目公开说明未在四个数据库工具描述中给出统一结果上限,应在数据库、代理或工具层自行设定超时和最大行数。
大结果会进入模型上下文和日志。优先聚合、分页与脱敏视图。
日志查询工具的边界
同一包支持 Loki LogQL、Elasticsearch Query DSL 和元数据查询。项目说明日志查询使用只读接口。
日志常包含用户数据、内部地址和错误上下文,敏感性不低于数据库。为日志连接使用独立别名和只读账户。
不要让查询数据库的 Agent 自动获得生产日志。按 MCP 客户端或工具策略分离。
Jenkins 工具不是只读
Jenkins 工具可以列出 Job、查看信息和日志,也可以触发构建。触发构建可能部署代码、运行测试、发布制品或修改基础设施。
Jenkins API Token 即使加密保存,也代表真实写能力。数据库只读提示无法约束 Jenkins 工具。
生产环境使用只允许查看的 Jenkins 账户,或完全不向数据库 Agent 暴露 build 工具。构建触发需要独立审批。
如何拆分工具权限
最安全方式是为数据库查询、日志查询和 Jenkins 管理运行不同实例或不同客户端配置,并使用各自系统账户和秘密。
如果包不支持工具级禁用,可用 MCP 网关白名单只转发 query_mysql、query_postgresql、query_mssql 和 query_oracle。
客户端工具审批设置为逐次确认,不能因某个工具 readOnlyHint 就自动信任整个 Server。
提示注入风险
Agent 读取数据库字段、日志和 Jenkins 输出时可能遇到恶意指令。攻击者可能诱导它查询其他表或触发构建。
把外部数据视为不可信内容,禁止其改变工具授权、连接别名和目标环境。高风险工具需要人工确认。
数据库只读账户可以阻止修改,却不能阻止权限范围内的数据外泄。按表列限制和脱敏仍然必要。
验证 SQL 拦截
在测试库分别对四种驱动提交合法 SELECT、SHOW、DESCRIBE 和 EXPLAIN,再提交 INSERT、UPDATE、DELETE、DROP、CREATE、ALTER 与多语句。
检查大小写、注释、CTE 和数据库专有函数。预期写操作在应用层拒绝,并在数据库层再次拒绝。
记录包版本和测试结果,升级后复跑。不要在生产库测试破坏性语句。
验证配置优先级
用无敏感测试连接分别创建用户级和项目级同名别名,确认项目级覆盖行为。然后删除项目配置,确认回退目标。
让 Agent 在执行前输出别名、数据库类型、主机标签和数据库名,但不输出密码。避免静默连接生产。
不可信仓库打开前扫描 .develop-tool.json 和环境文件,防止配置诱导连接攻击者数据库。
常见故障
查询被判定为写操作
检查语句类型、注释和方言,不要通过修改源码禁用安全检查。使用更简单只读查询或提交兼容修复。
配置解密失败
本机用户信息变化可能影响派生密钥。不要复制密文到另一账户,重新使用 password-stdin 创建配置。
项目别名连接错库
项目级配置优先于全局。停止操作、检查 .develop-tool.json,轮换可能泄露凭据并审计查询。
数据库工具可用但 Jenkins 也出现
这是同一包的扩展能力。通过客户端工具白名单或独立实例隐藏 Jenkins,不能只依赖提示。
推荐上线流程
先在测试项目安装固定版本,只配置一个数据库只读别名。验证四类允许语句和写入拒绝。
再检查配置权限、加密、password-stdin、项目覆盖和秘密轮换。确保数据库账户本身无法写入。
随后配置客户端工具白名单,只暴露所需数据库工具。日志和 Jenkins 使用独立实例、账户和审批。
最后增加网络限制、查询超时、行数上限、脱敏和审计,再评估生产使用。
撤销连接与异常响应
不再使用某个别名时,先从配置中移除,再在数据库侧锁定或删除对应用户。仅删除本地密文不能使已经泄露或缓存的数据库密码失效。项目级和用户级配置都要检查,避免同名别名从另一层重新出现。
发现异常查询、未知 Jenkins 构建或配置被覆盖时,立即停止 MCP 进程,撤销数据库、日志与 Jenkins 三类凭据,检查客户端工具调用和远端审计。不要只轮换数据库密码,因为同一服务中的其他 Token 也可能已经暴露。
恢复前使用干净设备重建配置,重新测试工具白名单与只读账户。保留必要证据,但在共享日志前删除密码、Token、连接地址和业务数据。
Database Query MCP Server 可以统一查询 MySQL、PostgreSQL、MSSQL 和 Oracle,并通过别名与项目配置降低连接成本。但安全结论必须限定到四个数据库查询工具:它们只读,不代表同包中的 Jenkins 能力无副作用。保持数据库级只读、隔离工具集、保护本地配置并验证项目覆盖,才能让自然语言查询保持可控。