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 或写进公开配置。
配置表和 stdio 示例使用 JMCP_ 前缀,但 HTTP 启动示例改写成 JDBC_URL、DB_USERNAME、DB_PASSWORD、MCP_MODE 和 MCP_HTTP_PORT。
这可能是 README 示例与代码版本不一致,也可能是启动脚本做了变量映射。部署前必须阅读当前源码和 run_http 脚本,并用无敏感测试库验证服务实际读取哪些变量。
不要为了让连接成功同时设置两套生产密码。先在临时环境确认权威配置,再只保留实际需要的一组。
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 实例。
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 系列权限。
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 限制一旦失效,数据库权限必须继续阻止写入。
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 与写权限。
JMCP_JDBC_URL=jdbc:sqlite:/absolute/path/to/database.db
SQLite 数据库是本地文件,安全边界由文件权限决定。即使 SQL 只允许 SELECT,运行账户若能写数据库或父目录,仍可能通过其他进程修改文件。
使用只读文件副本和只读挂载,限制 MCP 进程目录访问。不要把浏览器 cookies、应用凭据或真实用户数据 SQLite 文件直接交给模型。
list_schemas 列出当前数据库可见的模式。不同数据库的系统 schema 和目录含义不同,返回内容可能包含系统对象。
专用数据库账户应只看到必要范围。若工具仍列出大量系统 schema,评估是否需要应用层过滤。
先调用它可以帮助模型确认连接类型和目标环境,但 schema 名本身也可能泄露业务结构。
list_tables 按 schema 列出表。用户应明确指定 schema,避免全库枚举。
表列表不等于有权读取每张表。数据库驱动元数据可能返回可见对象,真正 query_table 仍由数据库权限决定。
生产环境对审计、密码、支付和个人信息表做数据库级拒绝,不依赖模型主动避开。
该工具读取列、类型和主键等表结构,适合生成查询和理解模型。
结构信息可以暴露敏感列位置、内部命名和数据关系。只向 Agent 展示完成任务所需对象。
不同数据库对主键、复合键、生成列和专有类型的 JDBC 元数据支持不同,结果需要实际验证。
query_table 用于读取表数据,并支持可选 limit。它比任意 execute_query 更容易约束,但仍可能读到敏感列。
设置强制行数上限,不允许客户端无限扩大。优先通过脱敏视图而不是原始表提供数据。
limit 只控制结果行数,不控制数据库扫描成本或单行大小。大表还需索引、超时和资源限制。
execute_query 接受自定义 SQL,默认 JMCP_QUERY_SELECT_ONLY=true,只允许 SELECT。
把变量设为 false 后会允许 INSERT、UPDATE、DELETE 等操作。这个开关会显著改变风险,不能在共享或生产服务上随意关闭。
即使保持 true,也要使用只读数据库账户。SQL 文本检查可能被方言、注释、编码、CTE、函数副作用或多语句绕过。
在隔离测试库提交 INSERT、UPDATE、DELETE、CREATE、DROP、ALTER 和多语句批次,确认应用拒绝。
再用同一数据库凭据绕过 MCP 直接连接,尝试写入,必须由数据库权限拒绝。只有两层都通过才具备只读纵深防御。
检查合法 WITH 查询、数据库专有 SELECT 和字符串中出现关键词时是否误判。升级版本后复跑测试。
false 模式让模型可以直接修改数据和结构。提示注入、误解和环境选错会造成不可逆变更。
确需写入时,创建独立短期 MCP 实例、专用低权限用户和测试数据库,要求人工审批并记录完整 SQL。
生产迁移优先使用正式变更工具和流水线。Agent 可以生成脚本,但不应从聊天直接执行。
stdio 是默认模式。MCP 客户端以子进程启动 JAR,通过 stdin 和 stdout 交换 JSON-RPC。
它不网络端口,适合 Claude Desktop、VS Code Copilot 等本地客户端。每个客户端实例使用自己的进程和环境变量。
标准输出必须只用于协议消息,日志写到标准错误。数据库密码放在客户端 env 仍可能被本机进程或配置读取,应使用受限文件和秘密注入。
HTTP 模式让服务器作为独立进程运行,客户端连接 /mcp SSE 端点,/health 提供健康检查。它可被多台机器共享。
README 示例使用明文 HTTP 和本机端口,只适合本地实验。远程部署必须增加 TLS、认证、授权、反向代理、速率限制和网络白名单。
仓库说明没有展示成熟的多租户身份与细粒度授权。不要把端口直接暴露到公网,也不要让多个不可信用户共享一个数据库凭据。
作者在讨论中说明当前没有大查询结果 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 仅回环或受保护私网。任何写入单独部署。
检查数据库用户元数据可见性、JDBC 驱动和当前 catalog。不要先扩大到管理员权限。
README 两套变量名不一致。检查当前源码和启动脚本,用测试值确认权威名称。
检查方言、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、为每个数据库运行独立实例、使用数据库级只读账户,并把项目定位为实验工具,才能避免把便利误当成生产安全。
ubuntu18.04左边dock面板怎么移动?
ubuntu18.04应用图标怎么放到桌面?
SafeDB MCP 如何通过策略层提供只读数据库访问?
Claude Code 与 Codex 交叉进行代码审查是否优于单模型审查?
Codex 是否适合在规划和验证阶段使用 xhigh、实现阶段使用 high?
多数据库 SQL MCP Server 能否同时支持 Oracle、PostgreSQL、SQL Server 和 MySQL?