Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - sleepinginsummer/agent-database-cli: A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。 · GitHub
Skip to content

Repository files navigation

agent-database-cli

基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon

CLI agent-database-cliLicense MITNode.js >=20npm >=10sys win/mac/linuxrelease v0.2.20

AI 一键安装 · 安装 · 配置 · 权限配置 · Oracle SQLcl · 许可证 · 友情链接

中文 | English

简介

agent-database-cli 是一个面向 Agent 的本地多数据库 CLI 工具,用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。

它能做的事:

  • 列出当前支持的数据库类型和本地已配置连接
  • 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
  • 查询数据库元信息,例如表、列、集合、Redis keys;Redis keys 元信息使用 SCAN 分批读取,避免阻塞式 KEYS
  • 按单个数据库配置启用只读模式和命令黑名单
  • Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 oracle/oracledb 原生驱动
  • 不保存或输出脱敏前的密码、token、secret

驱动配置表:

数据库type默认驱动驱动切换配置
MySQLmysqlRust 原生驱动 mysql_async暂不支持切换
PostgreSQLpostgresRust 原生驱动 tokio-postgres暂不支持切换
Redis 单机redisRust 原生驱动 redis仅配置 url
Redis 集群redisRust 原生驱动 redis同时配置 urlredisCluster.nodes
OracleoracleSQLcl支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client)
MongoDBmongodbRust 原生驱动 mongodb暂不支持切换;可配 database 指定默认库

安装

环境要求

  • Node.js >= 20
  • npm >= 10
  • 系统支持 Windows / macOS / Linux
  • 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
  • 本机网络可访问目标数据库
  • 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
  • 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21

AI 一键安装

安装请阅读 https://github.com/sleepinginsummer/agent-database-cli/blob/main/AI_INSTALL.md,按说明安装 CLI 并添加 `SKILL.md`。

手动全局安装

npm install -g agent-database-cli
agent-database-cli --help

如果 npm 包安装受限,使用等价的源码安装方式:

git clone https://github.com/sleepinginsummer/agent-database-cli.git
cd agent-database-cli
npm install
npm run build
npm link
agent-database-cli --help

安装/更新 Agent skill:

agent-database-cli install-skill --dry-run
agent-database-cli install-skill

配置

默认配置文件:

~/.agent-database-cli/config.json

可以通过环境变量修改配置位置:

AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list

配置文件是一个对象,databases 中每个 key 是一个数据库连接名。

连接配置:

字段适用范围默认值说明
type全部数据库数据库类型,支持 mysqlpostgresredisoraclemongodb
url全部数据库数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
passwordRef全部数据库数据库 URL 密码的本地密文引用;首次使用明文 URL 密码时自动生成
databaseMongoDBMongoDB 默认数据库名
oracleDriverOraclesqlclOracle 驱动:sqlcl 或原生驱动
sqlclPathOracle SQLclSQLcl 可执行文件路径,仅 oracleDriver: "sqlcl" 时使用
javaHomeOracle SQLclSQLcl 使用的 JAVA_HOME
redisClusterRedisRedis 集群配置,配置后会使用 Redis Cluster 模式
sshTunnel全部数据库SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发
readonly全部数据库true是否启用只读模式;仅在明确需要写入时才建议显式设为 false
blacklist全部数据库命令黑名单数组,大小写不敏感
keepAliveSeconds全部数据库180单个数据库连接空闲释放秒数

PostgreSQL URL 支持 sslmode 参数:disablepreferrequireverify-caverify-full。例如云数据库常用 postgres://user:password@host:5432/app?sslmode=require;生产环境需要校验证书时优先使用 verify-full

Redis 集群配置:

字段默认值说明
nodesRedis 集群节点 URL 数组,至少配置一个,支持 redis://rediss://

Redis 集群使用规则:

场景要求
启用集群模式必须同时配置 urlredisCluster.nodes
url用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
redisCluster.nodes用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
同时配置 sshTunnel程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
通过 SSH 隧道访问集群redisCluster.nodes 需要覆盖客户端实际可能访问到的集群节点地址

SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。

字段默认值说明
hostSSH 跳板机地址
port22SSH 端口
usernameSSH 用户名
passwordSSH 密码,可选
passwordRefSSH 密码的本地密文引用;首次使用明文 password 时自动生成
privateKeyPath私钥文件路径,可选,支持 ~
privateKey私钥内容,可选,和 privateKeyPath 二选一
passphrase私钥通行短语,可选,仅配置私钥时允许使用
passphraseRef私钥通行短语的本地密文引用;首次使用明文 passphrase 时自动生成
readyTimeoutSSH 连接超时时间,单位毫秒,可选

敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、sshTunnel.passwordsshTunnel.passphrase 会写入配置目录下的 secrets.json,本地密钥写入 secret.key,并把配置中的明文字段清空或移除密码内容后写入对应 *Ref。后续运行只通过引用解密到内存中使用;如需修改密码,把明文字段重新填成新值,下次使用会覆盖旧密文。

安全策略:

策略说明
检查优先级先检查黑名单,命中直接拒绝;未命中再检查只读模式
只读默认值默认启用只读模式,未显式配置 readonly 时也会拒绝写操作
推荐用法所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
写入配置某个连接确实需要写入时,再单独将该连接配置为 readonly: false

参考配置:

{
"databases": {
"local-mysql": {
"type": "mysql",
"url": "mysql://user:password@localhost:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete"],
"keepAliveSeconds": 180
},
"remote-mysql": {
"type": "mysql",
"url": "mysql://user:password@db.internal:3306/app",
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": "key-passphrase"
},
"readonly": true,
"keepAliveSeconds": 180
},
"redis-standalone": {
"type": "redis",
"url": "redis://localhost:6379",
"readonly": false,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"redis-cluster-via-ssh": {
"type": "redis",
"url": "redis://10.0.0.11:7001",
"redisCluster": {
"nodes": [
"redis://10.0.0.11:7001",
"redis://10.0.0.12:7001",
"redis://10.0.0.13:7001"
]
},
"sshTunnel": {
"host": "jump.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "~/.ssh/id_rsa"
},
"readonly": true,
"blacklist": ["flushall", "flushdb"],
"keepAliveSeconds": 180
},
"oracle-test": {
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"],
"keepAliveSeconds": 180
}
}
}

权限配置

权限控制建议同时使用 readonlyblacklist,不要只依赖其中一个。

只读模式

  • 默认值是 true
  • 不配置 readonly 时,仍然会按只读模式处理
  • 只读模式会额外拒绝存在写入语义的查询,例如 PostgreSQL SELECT INTO 和 MongoDB aggregate 中的 $out$merge
  • 推荐所有日常查询连接都保持默认只读
  • 需要修改数据时,建议先让 AI 生成对应 SQL 或命令,再由你确认后执行
  • 只有明确需要写入的专用连接,才单独配置 readonly: false

命令黑名单

  • 黑名单优先级高于只读模式
  • 命中黑名单后会直接拒绝,不再继续判断是否只读
  • 适合拦截高危命令,避免误执行删库、删表、结构变更、批量写入、清空缓存等操作
  • 建议生产库、共享测试库、线上 Redis 都配置黑名单

执行顺序

  1. 先检查 blacklist
  2. 命中则直接拒绝
  3. 未命中再检查 readonly
  4. readonly 生效时只允许读命令

常见高危命令

MySQL / PostgreSQL / Oracle 常见高危 SQL:

["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create", "replace", "grant", "revoke"]

Redis 常见高危命令:

["flushall", "flushdb", "del", "unlink", "set", "mset", "expire", "rename", "hset", "lpush", "rpush", "sadd", "zadd", "keys"]

MongoDB 常见高危命令:

["insertOne", "insertMany", "updateOne", "updateMany", "replaceOne", "deleteOne", "deleteMany", "findAndModify", "findOneAndUpdate", "findOneAndDelete", "drop", "dropDatabase", "createIndex", "dropIndex", "$out", "$merge"]

推荐配置示例

生产库推荐:

{
"type": "mysql",
"url": "mysql://user:password@prod-db:3306/app",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "alter", "create"],
"keepAliveSeconds": 180
}

允许写入的专用连接推荐:

{
"type": "postgres",
"url": "postgres://user:password@write-db:5432/app",
"readonly": false,
"blacklist": ["drop", "truncate", "alter"],
"keepAliveSeconds": 180
}

Oracle 保留双驱动设计:

  • 不配置 oracleDriver:默认 SQLcl。
  • oracleDriver: "sqlcl":显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
  • oracleDriver: "oracle":显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
  • oracleDriver: "oracledb":Node 版原生驱动兼容值;Rust 版按 oracle 原生入口处理。

当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。

Oracle SQLcl

官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/

Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 oracleDriver,或显式配置为 SQLcl:

{
"type": "oracle",
"url": "oracle://USER:password@127.0.0.1:1521/qftest201",
"oracleDriver": "sqlcl",
"sqlclPath": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"javaHome": "/Applications/IntelliJ IDEA Ultimate.app/Contents/jbr/Contents/Home",
"readonly": true,
"blacklist": ["drop", "truncate", "delete", "update", "insert", "merge", "alter", "create"]
}

SQLcl 模式会通过 stdin 传入连接脚本,避免密码出现在命令行参数列表中。安全检查仍在执行前完成,黑名单和只读模式都会生效。

更新

npm install -g agent-database-cli@latest

卸载和清理

npm uninstall -g agent-database-cli
npm cache clean --force
rm -rf ~/.agent-database-cli

许可证

MIT

友情链接

About

A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具,将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。

Resources

Stars

31 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages