基于 Java 21 和 MCP Java SDK 实现的数据库 MCP 服务,当前支持:
- PostgreSQL
- Oracle
这个仓库已经拆分为多模块结构,既可以通过 stdio 方式接入本地 MCP 客户端,也可以通过 HTTP 方式提供可管理的服务端。
database-mcp-core共享核心能力,包括运行时装配、数据库方言、连接管理、Schema 对比、工具注册等。database-mcp-stdio基于标准输入输出的 MCP Server,适合本地桌面客户端或命令行宿主进程。database-mcp-http基于 Spring Boot 3 的 HTTP 版 MCP Server,包含管理后台、SQLite 配置存储、API Key 校验等能力。
- 按
datasourceId路由到不同数据库连接 - 支持 PostgreSQL / Oracle 方言差异
- 提供常见数据库操作工具:
- 查询
- DDL / DML 执行
- Schema、表、索引管理
- 当前用户和数据库信息查询
- PostgreSQL 的表 DDL 导出
- PostgreSQL 的 Schema 对比与同步 SQL 生成
- HTTP 模式下支持:
- SQLite 持久化配置
- Web 管理后台
- API Key 鉴权
- 管理口令保护
要求:
- JDK 21
- Maven 3.9+
在仓库根目录执行:
mvn clean package只构建 HTTP 模块:
mvn clean package -pl database-mcp-http -am只构建 stdio 模块:
mvn clean package -pl database-mcp-stdio -am常见产物:
database-mcp-core\target\database-mcp-core-1.0.0.jardatabase-mcp-stdio\target\database-mcp-stdio-1.0.0.jardatabase-mcp-http\target\database-mcp-http-1.0.0.jar
stdio 模式默认只加载一个数据源,配置来自环境变量。
启动方式:
java -jar .\database-mcp-stdio\target\database-mcp-stdio-1.0.0.jar支持的环境变量:
DB_TYPE数据库类型,支持postgres/oracleDB_URLJDBC 地址DB_USER用户名DB_PASSWORD密码DB_SCHEMA默认 Schema
兼容旧变量:
PG_URLPG_USERPG_PASSWORDPG_SCHEMA
说明:
DB_*优先级高于PG_*stdio模式会把这个单一配置映射成默认数据源,datasourceId固定可理解为default- PostgreSQL 未显式配置 schema 时默认使用
public - Oracle 未显式配置 schema 时不强制默认值
启动方式:
java -jar .\database-mcp-http\target\database-mcp-http-1.0.0.jar默认服务:
- HTTP 端口:
8080 - MCP Endpoint:
/mcp - 管理页:
http://localhost:8080/admin/index.html - 管理 API 前缀:
/admin/api
HTTP 模式不是直接把 JDBC 连接暴露给客户端,而是通过 datasourceId 做二级路由:
datasourceId -> 数据源配置 -> 基础 JDBC 配置 + schema
这样做的目的:
- 客户端只传
datasourceId - 服务端统一维护真实数据库连接信息
- 多个数据源可以复用同一套基础 JDBC 地址配置
- 数据源可以绑定各自独立的用户名、密码、默认 Schema
HTTP 服务会把所有基础配置和数据源映射持久化到 SQLite。
默认文件:
data/database-mcp-config.db
启动行为:
- 服务先读取 SQLite 配置库。
- 配置库首次创建为空。
- 管理后台修改完成后,会刷新内存中的数据源路由。
主配置文件:
database-mcp-http/src/main/resources/application.yml
示例:
server:
port: 8080
database-mcp:
http:
endpoint: /mcp
keep-alive-interval: 60s
api-key-enabled: false
api-key-header: X-API-Key
api-key-secret: change-me-secret
api-key-ttl-seconds: 300
api-key-allowed-clock-skew-seconds: 30
admin-api-base-path: /admin/api
admin-password-header: X-Admin-Password
admin-password: ""
config-db-path: data/database-mcp-config.db说明:
- Oracle 当前按
SID组装连接,不支持serviceName admin-password留空时,默认管理口令为服务端当天日期,格式为yyyy-MM-ddapi-key-enabled=false时,MCP 接口不校验 API Key
管理后台页面:
http://localhost:8080/admin/index.html
默认请求头:
- 管理口令头:
X-Admin-Password - API Key 头:
X-API-Key
管理后台主要用途:
- 维护基础 JDBC 配置
- 维护数据源配置
- 查看和修改运行时路由数据
相关后端文件:
database-mcp-http/src/main/java/com/hbnrtech/mcp/http/admin/AdminConfigController.javadatabase-mcp-http/src/main/java/com/hbnrtech/mcp/http/admin/RuntimeConfigurationService.javadatabase-mcp-http/src/main/java/com/hbnrtech/mcp/http/admin/SqliteConfigRepository.java
相关前端文件:
database-mcp-http/src/main/resources/static/admin/index.htmldatabase-mcp-http/src/main/resources/static/admin/admin.cssdatabase-mcp-http/src/main/resources/static/admin/admin.js
API Key 格式:
clientId.timestamp.nonce.signature
签名算法:
Base64Url(HMAC_SHA256(secret, clientId.timestamp.nonce))
校验规则:
- 签名必须匹配
- 时间戳必须处于允许窗口内
- API Key 不绑定具体数据源
相关实现:
database-mcp-http/src/main/java/com/hbnrtech/mcp/http/config/ApiKeyAuthenticationFilter.javadatabase-mcp-http/src/main/java/com/hbnrtech/mcp/http/config/ApiKeySignatureService.java
核心工具名以 db_ 开头,例如:
db_querydb_executedb_list_schemasdb_list_tablesdb_describe_tabledb_create_tabledb_alter_tabledb_drop_tabledb_get_ddldb_list_indexesdb_create_indexdb_drop_indexdb_analyze_indexdb_infodb_current_userdb_compare_schemas
其中三个最常用工具的语义边界如下:
db_list_tables用于候选表发现和 schema 探索,不代表已经查到业务数据,也不应直接用于最终业务结论。db_get_ddl用于表结构、列、约束等 DDL 验证,不代表已经查到业务数据,也不应直接用于最终业务结论。db_query用于执行只读 SQL 以获取业务数据和证据。对需要业务结论、统计、趋势分析的问题,应以此工具的结果作为主要依据。
同时提供一套兼容别名:
pg_querypg_list_tablespg_describe_tablepg_db_info
这类别名本质上还是同一套实现,只是为了兼容旧客户端命名。
所有工具都会自动追加 datasourceId 参数。
例如:
{
"datasourceId": "order-db",
"tableName": "t_order"
}读操作示例:
{
"datasourceId": "order-db",
"sql": "select now()"
}说明:
- 客户端必须传
datasourceId schema多数场景可省略,服务端会按以下顺序决定:- 请求显式传入的
schema - 当前会话通过
db_switch_schema切换后的 schema - 数据源默认 schema
- PostgreSQL 默认
public
- 请求显式传入的
并不是所有工具对所有数据库都完全等价。
当前实现里:
db_get_ddl仅对 PostgreSQL 实现db_compare_schemas仅对 PostgreSQL 实现- 部分索引分析能力依赖具体方言支持
- Oracle 和 PostgreSQL 在 schema、标识符大小写、元数据查询 SQL 上存在差异
如果某个方言暂不支持某项能力,工具会返回明确错误信息,而不是静默降级。
database-mcp-core/src/main/java/com/hbnrtech/mcp/bootstrap/DatabaseMcpRuntimeFactory.javadatabase-mcp-core/src/main/java/com/hbnrtech/mcp/execution/DatasourceRegistry.javadatabase-mcp-core/src/main/java/com/hbnrtech/mcp/execution/ConnectionManager.javadatabase-mcp-core/src/main/java/com/hbnrtech/mcp/tools/GenericMcpTools.javadatabase-mcp-http/src/main/java/com/hbnrtech/mcp/http/config/DatabaseMcpHttpProperties.javadatabase-mcp-http/src/main/java/com/hbnrtech/mcp/http/config/McpHttpServerConfiguration.java
执行全部测试:
mvn testMIT