# mysql-cli
**Repository Path**: AllenMoving/mysql-cli
## Basic Information
- **Project Name**: mysql-cli
- **Description**: Go CLI for AI agent MySQL access
专为AI agent 设计的MySQL CLI
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: develop
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-07-28
- **Last Updated**: 2026-08-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mysql-cli
**让任何能跑 shell 的 AI agent 直接查询 MySQL 的 Go CLI - 无需 MCP runtime。**
[`designcomputer/mysql_mcp_server`](https://github.com/designcomputer/mysql_mcp_server) 的替代方案:
保留其全部读写能力,以普通子命令重新暴露。只要你的 agent 能跑 shell,就能查询 MySQL。
[English](./README.md) · [简体中文](./README-zh.md)
[](https://github.com/AllenMuu/mysql-cli/releases)
[](https://go.dev)
[](#安装)
[](#输出)
---
## 为什么需要它
原 MCP server 很好用 -- 直到你想在不支持 MCP 的 agent 里调用它。`mysql-cli` 保留了同样的
安全模型和功能集,但作为一个**默认输出 JSON**、**退出码稳定**的单二进制分发,任何 agent
(Claude Code、Cursor、Codex、Aider ……)都能直接通过 shell 驱动它。
- **Agent 优先** - 稳定的 JSON 信封 + 数字退出码,设计目标是被解析,而非被阅读。
- **默认安全** - 开箱即只读;写 / DDL / 破坏性操作需要显式 flag。
- **零配置迁移** - 直接兼容 MCP server 的 `MYSQL_*` 环境变量。
- **多数据源** - TOML 命名 profile,可选 SSH 隧道。
- **单一二进制** - `go install` 即用。
## 安装
根据你的身份选择对应路径。
### 人类用户
**一键脚本**(二进制 + agent skills + 写操作确认配置,支持 macOS/Linux/Windows):
```bash
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/AllenMuu/mysql-cli/main/install.sh -o install.sh
bash install.sh # 直接运行(不要 curl|bash),以保留交互提示
# Windows (PowerShell)
.\install.ps1
```
脚本会跑三步,每一步的交互提示都会问你:
1. 下载预编译二进制到 `~/.local/bin`(Windows 上是 `%USERPROFILE%\.local\bin`)。
2. 跑 `npx skills add AllenMuu/mysql-cli`,让你的 agent 能发现 `mysql-cli`。
3. 跑 `mysql-cli agent init`,让写操作弹出人类确认(见 [写操作确认](#写操作确认agent-init))。
**其他方式**(想精简步骤):
```bash
# npm wrapper(无需 Go 工具链,下载预编译二进制)
npx @allenmuu/mysql-cli install
# Go install
go install github.com/AllenMuu/mysql-cli/cmd/mysql-cli@latest
# 源码构建
git clone https://github.com/AllenMuu/mysql-cli.git && cd mysql-cli
go build -o mysql-cli ./cmd/mysql-cli
```
然后配置数据源并查询(见[配置](#配置)):
```bash
mysql-cli config init --global # 写入 ~/.config/mysql-cli/config.toml
# 编辑文件:host/user/password/database
mysql-cli query "SELECT * FROM users LIMIT 10"
mysql-cli # 进入 REPL(仅人类调试用)
```
### AI Agent
`mysql-cli` **没有浏览器认证流程**,agent 可在 shell 内分四步完成全部设置。编程式调用时
保持 `-f json`(默认值)-- JSON 信封 + 退出码是你解析的契约。
**第 1 步 - 安装二进制**
```bash
go install github.com/AllenMuu/mysql-cli/cmd/mysql-cli@latest
# `mysql-cli` 必须在 PATH 中 -- skill 按名字调用它。
# 备选:go build -o mysql-cli ./cmd/mysql-cli
```
**第 2 步 - 安装 Agent Skills**
`mysql-cli` 通过 [vercel-labs/skills](https://github.com/vercel-labs/skills) 生态提供 skills,
让 agent 第一次就能正确发现并调用它。
```bash
# 交互式(TTY)
npx skills add AllenMuu/mysql-cli
# 非交互(CI / agent)
npx skills add AllenMuu/mysql-cli --skill '*' -a claude-code -g -y
```
> 务必安装**全部 3 个** skill(`mysql-shared`、`mysql-query`、`mysql-schema`)。
> 后两个引用 `../mysql-shared/SKILL.md`,只装单个会导致引用断裂。
>
> 无 Node.js?手动把仓库的 `skills/` 目录复制到 agent 的 skill 目录(如 `~/.claude/skills/`)。
**第 3 步 - 配置数据源**
写入 `~/.config/mysql-cli/config.toml`(完整格式见[配置](#配置)):
```toml
default = "dev"
[datasource.dev]
host = "127.0.0.1"
port = 3306
user = "root"
password = "${MYSQL_DEV_PASSWORD}"
database = "app"
```
**第 4 步 - 验证并执行**
```bash
mysql-cli query "SELECT * FROM users LIMIT 10" # 默认 JSON 输出
```
响应契约见[输出](#输出)与[退出码](#退出码)。
## 写操作确认(`agent init`)
`--write` / `--ddl` / `--yes` 是 **AI 自己传**的 flag,表示它要修改数据。CLI 自身无法
把人类拉进确认环节。`mysql-cli agent init` 解决这个问题:为各 agent 安装配置,
**拦截任何包含这些 flag 的命令,在执行前弹窗找人类确认**。只读命令直接放行。
### 它装了什么
| Agent | `--project`(当前项目) | `--global`(用户级) | 能力 |
| --- | --- | --- | --- |
| `claude` | `.claude/settings.json` + `.claude/hooks/mysql-write-guard.py` | `~/.claude/...` | **强制**(PreToolUse hook → ask) |
| `cursor` | `.cursor/rules/mysql-cli-write-guard.mdc` | _不支持_(IDE 设置) | **引导**(仅规则) |
| `opencode` | `opencode.json` | `~/.config/opencode/opencode.json` | **强制**(permission glob → ask) |
| `copilot` | `.vscode/settings.json` + `.github/copilot-instructions.md` | VS Code User `settings.json` | **强制**(`autoApprove` 正则 → false) |
| `codebuddy` | `.codebuddy/settings.json` + `.codebuddy/hooks/mysql-write-guard.py` | `~/.codebuddy/...` | **强制**(PreToolUse hook → ask) |
| `trae` | `.trae/hooks.json` + `.trae/hooks/mysql-write-guard.py` | `~/.trae-cn/hooks.json` + `~/.trae-cn/hooks/mysql-write-guard.py` | **强制**(PreToolUse hook → ask;matcher `RunCommand`) |
- **强制** = 引擎级闸门:只有带 `--write` / `--ddl` / `--yes` 的命令才弹窗,只读静默放行。
- **引导** = 上下文指令,依赖模型自觉遵守(无引擎闸门)。
- Codex **不支持** -- hook 机制未坐实,`.rules` 无法按 flag 精确拦截。
- 合并类配置(`settings.json`、`opencode.json`、`.vscode/settings.json`、TRAE `hooks.json`)
会**深合并**进现有文件并备份 `.bak`;重复安装幂等。单文件配置(`.mdc`、`.md`)
默认跳过已存在文件,`--force` 覆盖。
- TRAE 路径不对称(项目级 `.trae` vs 全局 `~/.trae-cn`,带 `-cn` 后缀)是 TRAE 官方设计,
国际版 / 中国版相同。
### 怎么运行
```bash
# 人类(交互式 TTY):多选 agent + 层级
mysql-cli agent init
# CI / agent(非交互)
mysql-cli agent init --agents claude,opencode,copilot --project
mysql-cli agent init --agents codebuddy --global
mysql-cli agent init --agents cursor --project --dry-run # 预览不写
mysql-cli agent init --agents claude --project --json # JSON 结果
```
Flags:
| Flag | 用途 |
| --- | --- |
| `--agents ` | 逗号分隔的 agent 名(非 TTY 时必填) |
| `--project` / `--global` | 写到当前项目或用户级配置(非 TTY 时二选一必填) |
| `--force` | 覆盖已存在的单文件配置(`.mdc`、`.md`) |
| `--dry-run` | 只打印动作,不写文件 |
| `-j, --json` | 输出 JSON 结果 |
### 验证
装完后,在**新开**的 agent 会话里让它跑两条对照:读应放行,写应弹窗。
```bash
mysql-cli query "SELECT 1" # 静默放行
mysql-cli query "UPDATE t SET a=1 WHERE id=1" --write # 弹窗找人类
```
hook 脚本可单独测(TRAE 用 `RunCommand`;claude/codebuddy 用 `Bash`):
```bash
echo '{"tool_name":"RunCommand","tool_input":{"command":"mysql-cli query \"DROP TABLE x\" --write --yes"}}' \
| python3 .trae/hooks/mysql-write-guard.py
# 期望:{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"ask",...}}
```
完整能力对照、各 agent 写入路径与设计说明见
[`docs/agent-integration.md`](./docs/agent-integration.md)。
## 配置
`~/.config/mysql-cli/config.toml`(`--config` 可覆盖):
```toml
default = "dev"
[datasource.dev]
host = "127.0.0.1"
port = 3306
user = "root"
password = "${MYSQL_DEV_PASSWORD}"
database = "app"
[datasource.prod]
host = "db.prod.internal"
user = "ro_user"
password = "${MYSQL_PROD_PASSWORD}"
database = "main"
ssl_mode = "REQUIRED"
```
解析优先级:**CLI flag > 环境变量 > 配置文件 > 默认值**。密码支持 `${ENV}` 占位符。
原 MCP 的全部 `MYSQL_*` 环境变量同样支持,迁移零配置。
### 配置解析
mysql-cli 按链发现配置文件并合并:
- **文件优先级(高 → 低)**:`--config ` > `MYSQL_CLI_CONFIG` 环境变量 > 项目级 `/.config/mysql-cli/config.toml`(仅当已 [trust](#项目级-config-信任)) > 全局 `~/.config/mysql-cli/config.toml`。
- **短路**:设了 `--config` 或 `MYSQL_CLI_CONFIG` 时只读该文件,跳过自动发现。
- **同名 datasource**:高优先级文件整体替换(含其 `[ssh]` 子表)--字段不逐个合并。
- **不同名 datasource**:并集--所有文件的所有名字都可用。
- **`default` / `default_limit`**:高优先级文件胜出。
- **字段覆盖**:`MYSQL_*` 环境变量与 `--host/--port/--user/--password/--db` flag 覆盖任意文件里的 datasource 字段。
示例:全局定义 `[datasource.dev]` + `[datasource.prod]`;已 trust 的项目重定义 `[datasource.dev]`(不同 host)并新增 `[datasource.ci]`。生效: `dev`(项目的)、`prod`(全局的)、`ci`(项目的)。
### 项目级 config 信任
项目级 `/.config/mysql-cli/config.toml` **默认不加载**(防止 clone 来的恶意 repo 注入凭据)。
未 trust 时回落全局 config,并在 **stderr 告警**指出被跳过的文件(`--no-trust-warn`
或 `MYSQL_CLI_NO_TRUST_WARN=1` 静默;`--strict-trust` 升级为报错)。用
`mysql-cli config trust --yes`(非交互)或交互 `y/N` 显式信任--**AI 不得自动 trust**。
## 命令
| 命令 | 说明 |
| --- | --- |
| `query ` | 执行 SQL(默认只读;DML 需 `--write`) |
| `txn [sql2…]` | 在单个原子事务中执行多条语句 |
| `schema [table]` | 查看表结构;不指定表则查看整个数据库 |
| `sample ` | 采样行(`-n`,最多 20) |
| `tables [db]` | 列出表 |
| `databases` | 列出数据库 |
| `read ` | 前 100 行 |
| `explore` | 数据库 + 表概览 |
| `analyze ` | 一次返回 schema + sample |
| `version` | 打印 mysql-cli 二进制版本 |
| `config ` | 管理配置(`init` / `trust` / `path` / `show`) |
| `agent init` | 安装 per-agent 写操作确认配置(见[上文](#写操作确认agent-init)) |
| `help [command]` | 查看任意命令的帮助(也可用 `--help` / `-h`) |
| *(无)* | 进入交互式 REPL(人类调试) |
## Flags
| Flag | 说明 |
| --- | --- |
| `-d, --datasource ` | 配置中的命名数据源 |
| `-f, --format json\|table\|csv\|tsv\|jsonl` | 输出格式(默认 `json`) |
| `--write` | 允许 DML |
| `--ddl` | 允许 DDL(需 `--write`) |
| `--yes` | 标记破坏性操作(装了 `agent init` 配置时会触发人类确认弹窗) |
| `--limit N` | `SELECT` 行数上限 |
| `--no-limit` | 关闭默认的 1000 行 SELECT cap |
| `--timeout 30s` | 查询超时 |
| `--host/--port/--user/--password/--db` | 连接参数覆盖 |
## 输出
默认 JSON(agent 友好):
```json
{"success":true,"data":{"columns":["id"],"rows":[[1]]},"rows_affected":0,"meta":{}}
{"success":false,"error":{"code":"READONLY_VIOLATION","message":"UPDATE requires --write"}}
```
用 `-f table`、`-f csv`、`-f tsv` 或 `-f jsonl` 切换为其他格式。
### 退出码
| 码 | 含义 |
| ---: | --- |
| `0` | 正常 |
| `2` | 连接错误 |
| `3` | 只读违规 |
| `4` | DDL 需 `--write` |
| `5` | 破坏性操作需 `--yes` |
| `6` | 标识符非法 |
| `7` | 拒绝多语句输入 |
| `8` | SQL 错误 |
| `9` | 超时 |
| `10` | 配置错误 |
## 安全
默认只读。写操作按层级放行:
- DML 需 `--write`
- DDL 需 `--write --ddl`
- `DROP`/`TRUNCATE` 以及无 `WHERE` 的 `UPDATE`/`DELETE` 需 `--yes`
标识符按严格白名单校验(`^[a-zA-Z0-9_$]+$`);多语句输入被拒绝(请用 `txn`)。
只读 / 多语句检查在**打开连接之前**执行,因此 agent 无需触碰数据库即可拿到正确退出码。
> `--yes` 是**标记**,不是豁免:它告诉 CLI "这是破坏性操作,请找人类确认"。
> 装了 [`agent init`](#写操作确认agent-init) 配置时,弹窗就在那里触发。
## SSH 隧道
数据源可以通过 SSH 堡垒机建立隧道,而非直连:
```toml
[datasource.prod]
host = "127.0.0.1"
port = 3330
user = "ro_user"
password = "${MYSQL_PROD_PASSWORD}"
database = "main"
[datasource.prod.ssh]
enable = true
host = "bastion.prod"
user = "deploy"
key_path = "~/.ssh/id_ed25519"
remote_host = "db.prod.internal"
remote_port = 3306
local_port = 3330
```
隧道在建立数据库连接前打开,并与之一起关闭。
## Agent 技能
`mysql-cli` 内置 [Agent Skills](./skills/),让 agent 无需 MCP runtime 即可发现并驱动它。
Skills 编码了触发条件、前置检查、命令参考、安全模型与错误自修复 -- 让 agent 第一次就
能正确调用 `mysql-cli`。
共有三个 skill,沿用 `larksuite/cli` 的 shared-skill 模式:
| Skill | 用途 |
| --- | --- |
| [`mysql-shared`](./skills/mysql-shared/SKILL.md) | 配置、数据源、全局 flag、安全模型、退出码、错误自修复、输出格式 -- 被另外两个引用 |
| [`mysql-query`](./skills/mysql-query/SKILL.md) | 执行 SQL:`query`、`txn`、DML/DDL |
| [`mysql-schema`](./skills/mysql-schema/SKILL.md) | 探索 schema:`tables`、`databases`、`schema`、`sample`、`read`、`explore`、`analyze` |
### 其他 agent
`mysql-cli` 兼容**任何能跑 shell 命令并解析 JSON 的 agent**。`npx skills add` 安装器
(vercel-labs/skills)支持 Claude Code、Cursor、Codex 以及 70+ 种 agent;它以 symlink
方式安装每个 skill,因此更新仓库即可自动同步。
| Agent | 配置格式 | 安装 |
| --- | --- | --- |
| **Claude Code** | `.claude/skills/*/SKILL.md` | `npx skills add AllenMuu/mysql-cli -a claude-code` |
| **Cursor** | `.cursor/rules/*.mdc` | `npx skills add AllenMuu/mysql-cli -a cursor` |
| **Codex CLI** | `AGENTS.md` | `npx skills add AllenMuu/mysql-cli -a codex` |
| **OpenCode** | `.opencode/instructions.md` | `npx skills add AllenMuu/mysql-cli -a opencode` |
| **GitHub Copilot** | `.github/copilot-instructions.md` | `npx skills add AllenMuu/mysql-cli -a github-copilot` |
| **Windsurf** | `.windsurfrules` | `npx skills add AllenMuu/mysql-cli -a windsurf` |
| **Aider** | `.aider.instructions.md` | `npx skills add AllenMuu/mysql-cli -a aider`(然后在 `.aider.conf.yml` 加 `read:`) |
### 安装须知
- **`mysql-cli` 必须在 `PATH` 中** -- 用
`go install github.com/AllenMuu/mysql-cli/cmd/mysql-cli@latest` 安装,或编辑 skill
指向你构建的二进制。
- **配置文件** -- skill 期望 `~/.config/mysql-cli/config.toml`(`--config` 可覆盖)。见
[配置](#配置)。
- **默认 JSON 输出** -- skill 依赖 JSON 信封 + 退出码;编程式调用时保持 `-f json`(默认值)。
## 架构
严格单向分层;`result` 是无依赖的中立契约,解耦生产者与消费者。
```
cmd/mysql-cli/main -> cli (cobra 装配 + 退出码映射)
│
config ─-> conn ─-> query ─-> result
│ │ └─> safety (纯逻辑,零依赖)
│ └─> schema ─> result/safety
└ env/file repl (聚合 query + schema + format)
format ← result
```
| 包 | 职责 |
| --- | --- |
| `result` | 共享 `Result{Columns, Rows, RowsAffected, LastInsertID}` - 中立契约 |
| `safety` | SQL 分类、只读闸门、标识符校验、多语句与破坏性操作识别(纯逻辑,完全可单测) |
| `config` | TOML 命名数据源 + `MYSQL_*` 环境变量兼容 |
| `conn` | DSN 渲染、连接池、SSH 隧道生命周期 |
| `query` | 读 / 写 / 事务执行,每条语句过 `safety` 闸门 |
| `schema` | 只读探索命令 |
| `format` | `result` -> json/table/csv/tsv |
| `cli` | cobra 子命令 + `mapError`(error -> 退出码) |
| `repl` | readline 交互壳,供人类调试 |
| `agentsetup` | per-agent 写操作确认配置(模板内嵌于二进制) |
## 致谢
本项目灵感来源于并基于
[`designcomputer/mysql_mcp_server`](https://github.com/designcomputer/mysql_mcp_server)
构建。安全模型与功能集很大程度上承袭自该项目。
## 许可证
基于 [MIT 协议](./LICENSE) 发布。