多数据库 SQL MCP Server 能否同时支持 Oracle、PostgreSQL、SQL Server 和 MySQL?

作者:袖梨 2026-09-13

java-mcp-sql-server 可以通过 JDBC 同时支持 PostgreSQL、Oracle、Microsoft SQL Server、MySQL、MariaDB 和 SQLite。这里的“同时支持”指同一套 Java MCP 服务代码能根据 JDBC URL 连接这些数据库,并提供统一的模式浏览和查询工具;一个运行实例通常只配置一条 JDBC 连接,不会自动聚合六个数据库。

项目提供 list_schemas、list_tables、get_table_structure、query_table 和 execute_query 五个工具,默认只允许 SELECT。它支持由客户端直接启动的 stdio 模式,也支持独立运行的 HTTP/SSE 模式。

作者在发布帖中明确称它是实验项目,不是生产就绪软件。仓库提交和采用情况也很有限,HTTP 查询结果目前一次性返回,不支持大结果流式分块。适合本地测试、多数据库适配实验和学习 MCP,不应未经安全加固直接连接生产数据。

六种数据库是怎样统一的

服务使用 JDBC URL 和对应驱动建立数据库连接。JDBC 为 Java 提供统一连接、语句与结果集接口,使 MCP 工具不必为每个数据库重新设计一套协议。

统一接口不代表 SQL 方言统一。分页、标识符引用、系统模式、数据类型、日期函数和元数据实现仍有差异。execute_query 中的自定义 SQL必须符合当前数据库方言。

从 PostgreSQL 切到 Oracle 只改 JDBC URL 不一定足够。需要验证驱动依赖、认证、TLS、schema 语义和每个工具的元数据查询。

支持的数据库列表

PostgreSQL 使用 postgresql JDBC URL;Oracle 使用 thin 驱动 URL;SQL Server 使用 sqlserver URL 和 databaseName;MySQL 与 MariaDB 使用各自驱动;SQLite 指向本地数据库文件。

仓库 README 声明支持六类数据库,但没有给出广泛版本兼容矩阵。部署前应在目标数据库版本上运行真实测试,不能从驱动能够连接就推断所有工具行为一致。

云托管数据库还需验证证书、网络、IAM 或云身份认证。示例主要使用用户名和密码,不代表企业身份自动支持。

运行环境要求

项目要求 Java 21 或更高版本、Maven 3.6 以上,以及可访问的目标数据库。先检查实际版本:

java -version
mvn -version

Java 运行时与 Maven 构建使用的 JDK 应一致。MCP 客户端启动的 java 可能来自不同 PATH,配置时优先使用绝对路径。

数据库驱动、证书和本地原生配置也要进入版本清单。构建产物应固定提交哈希并完成依赖扫描。

怎样构建项目

检出官方仓库后使用 Maven 打包:

mvn clean package

构建前阅读 pom.xml,确认 JDBC 驱动和 MCP SDK 版本。实验项目不一定提供签名发布包或稳定 release,应自行保留可复现构建记录。

不要在数据库服务器上以管理员账户直接构建。使用隔离开发机或 CI,产物通过校验后部署到普通服务账户。

核心环境变量

README 配置表列出 JMCP_JDBC_URL、JMCP_DB_USERNAME、JMCP_DB_PASSWORD、JMCP_MODE、JMCP_HTTP_PORT 和 JMCP_QUERY_SELECT_ONLY。

JMCP_JDBC_URL=jdbc:postgresql://dbhost:5432/reporting
JMCP_DB_USERNAME=mcp_reader
JMCP_DB_PASSWORD=replace-with-secret
JMCP_MODE=stdio
JMCP_QUERY_SELECT_ONLY=true

前三项定义数据库连接,mode 默认为 stdio,HTTP 端口默认 3000,SELECT_ONLY 默认为 true。密码不能提交进 Git 或写进公开配置。

README 环境变量存在不一致

配置表和 stdio 示例使用 JMCP_ 前缀,但 HTTP 启动示例改写成 JDBC_URL、DB_USERNAME、DB_PASSWORD、MCP_MODE 和 MCP_HTTP_PORT。

这可能是 README 示例与代码版本不一致,也可能是启动脚本做了变量映射。部署前必须阅读当前源码和 run_http 脚本,并用无敏感测试库验证服务实际读取哪些变量。

不要为了让连接成功同时设置两套生产密码。先在临时环境确认权威配置,再只保留实际需要的一组。

PostgreSQL 配置示例

JMCP_JDBC_URL=jdbc:postgresql://localhost:5432/mydb
JMCP_DB_USERNAME=mcp_reader
JMCP_DB_PASSWORD=replace-with-secret

生产连接启用 TLS 和证书验证,并创建只具备 CONNECT、USAGE 与目标表 SELECT 的角色。不要使用 postgres 超级用户。

schema 在 PostgreSQL 中与数据库不同,list_schemas 只列当前连接数据库内的模式。多个数据库通常需要多个 MCP 实例。

Oracle 配置示例

JMCP_JDBC_URL=jdbc:oracle:thin:@dbhost:1521:ORCL
JMCP_DB_USERNAME=mcp_reader
JMCP_DB_PASSWORD=replace-with-secret

服务名、SID 和现代连接描述符写法可能不同,以目标 Oracle 环境为准。启用 TCPS 时配置 wallet、truststore 与服务器证书验证。

只授予 CREATE SESSION 和必要对象 SELECT。检查 PUBLIC 与角色继承,不给 DBA 或 ANY 系列权限。

SQL Server 配置示例

JMCP_JDBC_URL=jdbc:sqlserver://dbhost:1433;databaseName=mydb
JMCP_DB_USERNAME=mcp_reader
JMCP_DB_PASSWORD=replace-with-secret

生产 URL 增加加密和证书验证参数,使用专用登录并映射到目标数据库。db_datareader 仍可能读取过多表,敏感环境创建自定义角色。

不要使用 sa、sysadmin 或 db_owner。应用层 SELECT 限制一旦失效,数据库权限必须继续阻止写入。

MySQL 与 MariaDB 配置

JMCP_JDBC_URL=jdbc:mysql://dbhost:3306/mydb
JMCP_JDBC_URL=jdbc:mariadb://dbhost:3306/mydb

两者协议相似但驱动与方言并非完全一致。验证 metadata API、大小写、时区、字符集和 TLS 参数。

数据库用户只授予目标 schema 的 SELECT 和必要 SHOW VIEW。撤销 FILE、PROCESS、SUPER、CREATE、ALTER 与写权限。

SQLite 配置

JMCP_JDBC_URL=jdbc:sqlite:/absolute/path/to/database.db

SQLite 数据库是本地文件,安全边界由文件权限决定。即使 SQL 只允许 SELECT,运行账户若能写数据库或父目录,仍可能通过其他进程修改文件。

使用只读文件副本和只读挂载,限制 MCP 进程目录访问。不要把浏览器 cookies、应用凭据或真实用户数据 SQLite 文件直接交给模型。

list_schemas 工具

list_schemas 列出当前数据库可见的模式。不同数据库的系统 schema 和目录含义不同,返回内容可能包含系统对象。

专用数据库账户应只看到必要范围。若工具仍列出大量系统 schema,评估是否需要应用层过滤。

先调用它可以帮助模型确认连接类型和目标环境,但 schema 名本身也可能泄露业务结构。

list_tables 工具

list_tables 按 schema 列出表。用户应明确指定 schema,避免全库枚举。

表列表不等于有权读取每张表。数据库驱动元数据可能返回可见对象,真正 query_table 仍由数据库权限决定。

生产环境对审计、密码、支付和个人信息表做数据库级拒绝,不依赖模型主动避开。

get_table_structure 工具

该工具读取列、类型和主键等表结构,适合生成查询和理解模型。

结构信息可以暴露敏感列位置、内部命名和数据关系。只向 Agent 展示完成任务所需对象。

不同数据库对主键、复合键、生成列和专有类型的 JDBC 元数据支持不同,结果需要实际验证。

query_table 工具

query_table 用于读取表数据,并支持可选 limit。它比任意 execute_query 更容易约束,但仍可能读到敏感列。

设置强制行数上限,不允许客户端无限扩大。优先通过脱敏视图而不是原始表提供数据。

limit 只控制结果行数,不控制数据库扫描成本或单行大小。大表还需索引、超时和资源限制。

execute_query 工具

execute_query 接受自定义 SQL,默认 JMCP_QUERY_SELECT_ONLY=true,只允许 SELECT。

把变量设为 false 后会允许 INSERT、UPDATE、DELETE 等操作。这个开关会显著改变风险,不能在共享或生产服务上随意关闭。

即使保持 true,也要使用只读数据库账户。SQL 文本检查可能被方言、注释、编码、CTE、函数副作用或多语句绕过。

默认 SELECT 限制应怎样验证

在隔离测试库提交 INSERT、UPDATE、DELETE、CREATE、DROP、ALTER 和多语句批次,确认应用拒绝。

再用同一数据库凭据绕过 MCP 直接连接,尝试写入,必须由数据库权限拒绝。只有两层都通过才具备只读纵深防御。

检查合法 WITH 查询、数据库专有 SELECT 和字符串中出现关键词时是否误判。升级版本后复跑测试。

为什么不建议关闭 SELECT_ONLY

false 模式让模型可以直接修改数据和结构。提示注入、误解和环境选错会造成不可逆变更。

确需写入时,创建独立短期 MCP 实例、专用低权限用户和测试数据库,要求人工审批并记录完整 SQL。

生产迁移优先使用正式变更工具和流水线。Agent 可以生成脚本,但不应从聊天直接执行。

stdio 模式

stdio 是默认模式。MCP 客户端以子进程启动 JAR,通过 stdin 和 stdout 交换 JSON-RPC。

它不网络端口,适合 Claude Desktop、VS Code Copilot 等本地客户端。每个客户端实例使用自己的进程和环境变量。

标准输出必须只用于协议消息,日志写到标准错误。数据库密码放在客户端 env 仍可能被本机进程或配置读取,应使用受限文件和秘密注入。

HTTP/SSE 模式

HTTP 模式让服务器作为独立进程运行,客户端连接 /mcp SSE 端点,/health 提供健康检查。它可被多台机器共享。

README 示例使用明文 HTTP 和本机端口,只适合本地实验。远程部署必须增加 TLS、认证、授权、反向代理、速率限制和网络白名单。

仓库说明没有展示成熟的多租户身份与细粒度授权。不要把端口直接暴露到公网,也不要让多个不可信用户共享一个数据库凭据。

HTTP 结果不是流式分块

作者在讨论中说明当前没有大查询结果 streaming,结果会整体执行并一次返回。SSE 用于 MCP 通信,不代表数据库结果逐行流式传输。

大结果可能占用数据库、服务 JVM、网络和客户端内存,并把大量数据送入模型上下文。

必须设置查询 limit、响应大小和数据库超时。分析任务采用分页或聚合,不请求整表。

一个实例能否连接多个数据库

从公开配置看,每个进程只有一组 JMCP_JDBC_URL、用户名和密码,因此一个实例对应一个连接目标。

需要同时使用 PostgreSQL 与 Oracle时,启动两个实例,使用不同 MCP 名称、端口、服务账户和秘密。不要在一个脚本中动态替换生产 URL。

客户端可同时注册多个 MCP Server,但模型可能选错。名称中明确数据库类型、环境和权限,例如 pg-dev-reader 与 oracle-test-reader。

多数据库并不等于多数据库事务

多个实例能在同一对话被调用,不表示它们共享事务、隔离级别或一致性快照。

跨库对比需要记录各数据库查询时间和版本。不要让模型把不同时间点结果当成原子快照。

跨数据库写入更不应通过多个实验 MCP 协调,应使用正式集成和补偿机制。

生产使用前缺少哪些能力

公开文档没有展示完整认证、角色授权、租户隔离、审计、结果遮罩、查询成本限制、连接池治理和高可用设计。

仓库规模和提交数量很小,作者也说明是实验。功能可用性不能等同生产成熟度。

若企业要采用,需要代码审计、威胁建模、依赖治理、认证网关、数据库最小权限、日志、坚控和故障恢复。

提示注入与数据泄露

模型读取的表字段可能包含恶意指令,诱导它调用 execute_query 查询其他允许数据。

只读账户防止修改,但无法阻止读取权限内的数据泄露。按表和列限制,使用脱敏视图,并控制结果进入的模型服务。

不要把数据库错误、连接字符串和凭据返回给客户端。日志也需脱敏。

最小权限部署

为每个数据库创建专用只读用户,只授予目标 schema 和表 SELECT。SQLite 使用只读副本和文件权限。

MCP 进程使用普通系统账户,不能读取整个主目录或其他服务秘密。网络只允许目标数据库端口。

JMCP_QUERY_SELECT_ONLY 保持 true,HTTP 仅回环或受保护私网。任何写入单独部署。

常见故障

能连接但 list_schemas 为空

检查数据库用户元数据可见性、JDBC 驱动和当前 catalog。不要先扩大到管理员权限。

HTTP 模式读取不到环境变量

README 两套变量名不一致。检查当前源码和启动脚本,用测试值确认权威名称。

SELECT 被错误拒绝

检查方言、CTE、注释和过滤规则。不要直接关闭 SELECT_ONLY,先修复或绕开测试环境中的兼容问题。

客户端收到超大响应

当前没有分块 streaming。缩小查询、增加 limit 和数据库超时,并在网关设置响应上限。

推荐验证流程

第一步在本地 SQLite 或临时数据库构建 JAR,验证五个工具。第二步为每种目标数据库建立最小权限测试用户。

第三步验证 SELECT 与写入拒绝,检查特殊方言和元数据。第四步测试 stdio,再在回环地址测试 HTTP/SSE。

第五步测试大结果、断线、并发和凭据轮换。未补齐认证、审计和限制前,不连接生产数据库。

java-mcp-sql-server 确实用一套 Java 代码覆盖 PostgreSQL、Oracle、SQL Server、MySQL、MariaDB 和 SQLite,但它提供的是统一 JDBC 接入,不是成熟的跨数据库治理平台。保持默认 SELECT、为每个数据库运行独立实例、使用数据库级只读账户,并把项目定位为实验工具,才能避免把便利误当成生产安全。

相关文章

精彩推荐