@yanzhang123/readonly-db-mcp 0.9.14 → 0.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -41,13 +41,22 @@
|
|
|
41
41
|
npx -y @yanzhang123/readonly-db-mcp
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
生产环境建议固定经过审核的版本,在包名后加 `@<版本>`,版本号见 [npm 页面](https://www.npmjs.com/package/@yanzhang123/readonly-db-mcp?activeTab=versions)。
|
|
45
|
+
|
|
46
|
+
首次运行时,启动器会在用户缓存目录创建版本化虚拟环境,并安装包内 wheel 与带 SHA-256 锁定的 Python 依赖。完成后的环境按 wheel 和依赖锁指纹复用。可通过 `MYSQL_MCP_PYTHON` 指定 Python,通过 `MYSQL_MCP_NPM_CACHE_DIR` 修改缓存位置。
|
|
47
|
+
|
|
48
|
+
### Claude Code 一行安装
|
|
49
|
+
|
|
50
|
+
先复制 [`mysql-connections.example.toml`](mysql-connections.example.toml) 为本地配置文件,再把配置文件的绝对路径和密码环境变量交给 Claude Code:
|
|
45
51
|
|
|
46
52
|
```bash
|
|
47
|
-
|
|
53
|
+
claude mcp add mysql-readonly \
|
|
54
|
+
-e MYSQL_PROFILES_FILE=/absolute/path/mysql-connections.toml \
|
|
55
|
+
-e MYSQL_DEV_PASSWORD=由密钥存储提供 \
|
|
56
|
+
-- npx -y @yanzhang123/readonly-db-mcp
|
|
48
57
|
```
|
|
49
58
|
|
|
50
|
-
|
|
59
|
+
Windows 上无法启动 `npx` 时改用 `npx.cmd`。其他客户端的配置见 [客户端配置](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/CONFIGURATION.md#mcp-客户端配置)。
|
|
51
60
|
|
|
52
61
|
### 最小 MCP 配置
|
|
53
62
|
|
|
@@ -58,7 +67,7 @@ npx -y @yanzhang123/readonly-db-mcp@0.9.1
|
|
|
58
67
|
"mcpServers": {
|
|
59
68
|
"mysql-readonly": {
|
|
60
69
|
"command": "npx",
|
|
61
|
-
"args": ["-y", "@yanzhang123/readonly-db-mcp
|
|
70
|
+
"args": ["-y", "@yanzhang123/readonly-db-mcp"],
|
|
62
71
|
"env": {
|
|
63
72
|
"MYSQL_PROFILES_FILE": "C:/absolute/path/mysql-connections.toml",
|
|
64
73
|
"MYSQL_DEV_PASSWORD": "由客户端密钥存储提供"
|
|
@@ -82,529 +91,26 @@ cd mysql_mcp_server
|
|
|
82
91
|
pip install ".[http]" # 只用 STDIO 时可省略 [http]
|
|
83
92
|
```
|
|
84
93
|
|
|
85
|
-
##
|
|
86
|
-
|
|
87
|
-
### 结果脱敏配置
|
|
88
|
-
|
|
89
|
-
**默认不脱敏。** 代码不再内置敏感字段名单;省略配置或配置为空时,所有结果字段(包括密码、Token、联系方式及 JSON 内键)均按查询结果返回,`masked_columns` 为空。
|
|
90
|
-
|
|
91
|
-
命名连接通过 `mask_columns` 指定要隐藏的字段。配置属于各自连接,支持大小写不敏感的字段名和通配符:
|
|
92
|
-
|
|
93
|
-
```toml
|
|
94
|
-
[connections.dev]
|
|
95
|
-
# 其他连接参数见下方完整示例。
|
|
96
|
-
mask_columns = [] # 默认全部放开;省略此项效果相同。
|
|
97
|
-
# 如需脱敏,将上面一行改为自己的字段列表,例如:
|
|
98
|
-
# mask_columns = ["password", "access_token", "users.phone"]
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
旧单连接模式通过 `MYSQL_MASK_COLUMNS` 配置,以逗号分隔;未设置或设为空字符串均不脱敏。例如 `MYSQL_MASK_COLUMNS=password,access_token` 只按这两个规则处理。使用命名连接文件时,以各连接自己的 `mask_columns` 为准。
|
|
102
|
-
|
|
103
|
-
显式配置会把每个结果列追溯到底层表的字段:别名、表达式、函数与类型转换、窗口函数、标量子查询与关联子查询、派生表、CTE(含列清单)、`UNION`、`LATERAL`、`JSON_TABLE`、`TABLE` 语句和 `*` 都会继续追踪,并对 JSON 内匹配的键递归处理。按路径从 JSON 文档读取的值也会检查路径中的键:`JSON_EXTRACT`、`->`、`->>`、`JSON_VALUE` 和 `JSON_TABLE` 列的路径只要经过匹配不带点规则的键(例如 `$.contact.phone` 匹配 `phone`),读出的值就会隐藏;路径含通配符、递归 `**` 或不是常量时按敏感处理。派生表或 CTE 中名称匹配规则的列也视为敏感来源;只有最外层的别名不算。不带点的模式只匹配字段名,例如 `password`;带点的模式按限定路径匹配,例如 `users.phone` 或 `app.users.phone`,表别名会解析回真实表名,未写库名的表按当前库匹配。`COUNT` / `COUNT(DISTINCT ...)` 统计值可以正常读取,同一查询中匹配规则的原始值和拼接值仍会隐藏;`WHERE`、`HAVING`、`EXISTS`、`IN` 子查询里的值不会出现在结果中,不会让其他列被遮蔽。
|
|
104
|
-
|
|
105
|
-
脱敏按 fail-closed 设计:某个结果列的来源无法确定时(例如无法解析的列名、子查询中可能来自外层查询的列,或 MySQL 自动生成、与表达式文本对不上的列名),只要它可能来自匹配规则的字段,就按敏感处理;SQL 分析失败时同样按保守规则处理。因此少数复杂查询可能多遮几列。
|
|
106
|
-
|
|
107
|
-
脱敏是结果出口的辅助控制,不是访问授权边界:它基于 SQL 静态分析,无法看到视图定义、存储函数内部或数据库中实际的表结构,也不能排除尚未覆盖的 SQL 写法。绝不能暴露的字段,应在数据库层用只包含安全字段的视图或列级权限隔离,再让本服务使用该账号。
|
|
108
|
-
|
|
109
|
-
脱敏只替换返回值,不改变 MySQL 的 `WHERE` / `JOIN` 条件或删除结果行。`[REDACTED]` 表示值被隐藏,JSON/compact 的 `masked_columns` 可定位受影响列。已有的非空配置仍会生效;需要全部放开时,把它改成空列表(单连接模式清空环境变量),或删除该配置项。
|
|
110
|
-
|
|
111
|
-
### 推荐:命名连接
|
|
112
|
-
|
|
113
|
-
将 [`mysql-connections.example.toml`](mysql-connections.example.toml) 复制为已被 Git 忽略的 `mysql-connections.toml`,然后集中声明各环境:
|
|
114
|
-
|
|
115
|
-
```toml
|
|
116
|
-
default = "dev"
|
|
117
|
-
|
|
118
|
-
[connections.dev]
|
|
119
|
-
description = "本地开发环境"
|
|
120
|
-
host = "127.0.0.1"
|
|
121
|
-
port = 3306
|
|
122
|
-
user = "readonly_user"
|
|
123
|
-
password_env = "MYSQL_DEV_PASSWORD"
|
|
124
|
-
database = "app_dev"
|
|
125
|
-
allowed_databases = ["app_dev", "analytics_dev"]
|
|
126
|
-
query_timeout_ms = 30000
|
|
127
|
-
max_rows = 500
|
|
128
|
-
max_cell_length = 20000
|
|
129
|
-
result_format = "json"
|
|
130
|
-
# 默认不脱敏;需要时在列表中填写字段名或模式。
|
|
131
|
-
mask_columns = []
|
|
132
|
-
pool_size = 3
|
|
133
|
-
audit_enabled = true
|
|
134
|
-
|
|
135
|
-
[connections.prod]
|
|
136
|
-
description = "生产只读副本"
|
|
137
|
-
host = "prod-read.example.internal"
|
|
138
|
-
user = "readonly_user"
|
|
139
|
-
password_env = "MYSQL_PROD_PASSWORD"
|
|
140
|
-
database = "app"
|
|
141
|
-
allowed_databases = ["app", "reporting"]
|
|
142
|
-
allowed_functions = [] # 仅填写已经审核、确定无副作用的 UDF/存储函数
|
|
143
|
-
query_timeout_ms = 15000
|
|
144
|
-
max_rows = 200
|
|
145
|
-
result_format = "json"
|
|
146
|
-
pool_size = 5
|
|
147
|
-
ssl_mode = "VERIFY_CA"
|
|
148
|
-
ssl_ca = "C:/certs/company-ca.pem"
|
|
149
|
-
|
|
150
|
-
# 企业审计配置
|
|
151
|
-
audit_enabled = true
|
|
152
|
-
audit_log_file = "C:/var/log/mysql-mcp/audit.jsonl"
|
|
153
|
-
audit_log_max_bytes = 10000000
|
|
154
|
-
audit_log_backup_count = 10
|
|
155
|
-
audit_hmac_key_env = "MYSQL_MCP_AUDIT_SIGNING_KEY"
|
|
156
|
-
audit_required_context = ["actor", "purpose", "ticket_id"]
|
|
157
|
-
audit_fail_closed = true
|
|
158
|
-
audit_fsync = true
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
通过环境变量提供配置路径和密钥:
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
MYSQL_PROFILES_FILE=C:/absolute/path/mysql-connections.toml
|
|
165
|
-
MYSQL_DEV_PASSWORD=...
|
|
166
|
-
MYSQL_PROD_PASSWORD=...
|
|
167
|
-
MYSQL_MCP_AUDIT_SIGNING_KEY=... # 由密钥管理系统提供,禁止提交
|
|
168
|
-
MYSQL_DEFAULT_CONNECTION=dev # 可选,覆盖 TOML 中的 default
|
|
169
|
-
MYSQL_MAX_ROWS=500 # 可选,1-1000,默认 500
|
|
170
|
-
MYSQL_QUERY_TIMEOUT_MS=30000 # 整次调用超时,100-300000 毫秒
|
|
171
|
-
MYSQL_MAX_CELL_LENGTH=20000 # 超长单元格截断长度
|
|
172
|
-
MYSQL_RESULT_FORMAT=json # json 或 csv
|
|
173
|
-
MYSQL_POOL_SIZE=0 # 旧单连接模式;命名配置默认 5
|
|
174
|
-
MYSQL_ALLOWED_DATABASES=app,reporting
|
|
175
|
-
MYSQL_ALLOWED_FUNCTIONS= # 可选,经过审核的函数名
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
推荐使用 `password_env`。本地环境也支持 `password` 字段,但 `mysql-connections.toml` 已加入 `.gitignore`,因为它可能包含敏感信息。桌面 MCP 客户端的工作目录不固定,因此 `MYSQL_PROFILES_FILE` 必须使用绝对路径。
|
|
94
|
+
## 文档
|
|
179
95
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
[connections.dev]
|
|
186
|
-
host = "127.0.0.1"
|
|
187
|
-
user = "readonly_user"
|
|
188
|
-
credential_provider = "keyring"
|
|
189
|
-
credential_ref = "dev"
|
|
190
|
-
database = "app_dev"
|
|
191
|
-
allowed_databases = ["app_dev"]
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
使用遮罩输入在本机管理凭据:
|
|
195
|
-
|
|
196
|
-
```powershell
|
|
197
|
-
readonly-db-mcp credentials --profiles-file C:/absolute/path/mysql-connections.toml set dev
|
|
198
|
-
readonly-db-mcp credentials --profiles-file C:/absolute/path/mysql-connections.toml status dev
|
|
199
|
-
readonly-db-mcp credentials --profiles-file C:/absolute/path/mysql-connections.toml delete dev
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Windows 下 `keyring` 使用 Windows 凭据管理器。无桌面的服务环境可设置 `credential_provider = "command"`,并通过 `credential_command = ["executable", "arg1"]` 调用经过批准的密钥管理 CLI。程序不会通过 shell 执行命令;stderr 会被丢弃,输出长度受限,且只接受一行非空 UTF-8 文本。失败信息不会包含密钥、命令参数或凭据引用。
|
|
203
|
-
|
|
204
|
-
每次请求最多读取一次凭据(含连接重试)。`keyring` 或 `command` 较慢时,可设置 `credential_cache_seconds = 30`(0–300,默认 0 即不缓存)在进程内存中短期复用密码:轮换后的新密码最晚在该时长后生效;服务端返回认证失败(1045/1698)、调用 `validate_connections` 或进程退出时立即丢弃缓存。该项只对 `keyring` 和 `command` 有效。
|
|
205
|
-
|
|
206
|
-
### 逻辑环境路由
|
|
207
|
-
|
|
208
|
-
一个逻辑环境分布在多个物理实例时,可声明精确别名:
|
|
209
|
-
|
|
210
|
-
```toml
|
|
211
|
-
[routes.shared-test]
|
|
212
|
-
ubp = { connection = "test-ubp", database = "ubp" }
|
|
213
|
-
gts = { connection = "test-gts", database = "gts" }
|
|
214
|
-
eam = { connection = "test-eam", database = "eam" }
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
调用 `connection="shared-test", database="eam"` 时,只会解析到声明的目标。未知别名会明确失败,服务不会搜索或猜测其他环境。JSON 结果和审计记录会同时保留请求目标与实际目标。
|
|
218
|
-
|
|
219
|
-
每次调用都可以选择环境,无需重启:
|
|
220
|
-
|
|
221
|
-
```json
|
|
222
|
-
{
|
|
223
|
-
"connection": "prod",
|
|
224
|
-
"database": "app",
|
|
225
|
-
"query": "SELECT COUNT(*) FROM orders",
|
|
226
|
-
"audit_context": {
|
|
227
|
-
"actor": "reporting-service",
|
|
228
|
-
"purpose": "月末对账",
|
|
229
|
-
"ticket_id": "FIN-2026-042"
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
服务刻意不提供进程级“切换连接/数据库”工具。显式逐次选择可防止一个并发客户端悄悄改变另一个客户端的活动环境。
|
|
235
|
-
|
|
236
|
-
配置文件的大小或修改时间变化后会自动热加载。单个配置无效时,`validate_connections` 会报告该配置,但不会停用其他有效配置。密码环境变量只在使用对应连接时解析,因此生产凭据暂时不可用不会影响本地开发环境。
|
|
237
|
-
|
|
238
|
-
### 旧版单连接环境变量
|
|
239
|
-
|
|
240
|
-
未设置 `MYSQL_PROFILES_FILE` 时,仍可使用原有环境变量:
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
MYSQL_HOST=localhost
|
|
244
|
-
MYSQL_PORT=3306
|
|
245
|
-
MYSQL_USER=readonly_user
|
|
246
|
-
MYSQL_PASSWORD=your_password
|
|
247
|
-
MYSQL_DATABASE=your_database
|
|
248
|
-
MYSQL_ALLOWED_DATABASES=your_database
|
|
249
|
-
|
|
250
|
-
MYSQL_SSL_MODE=REQUIRED # DISABLED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY
|
|
251
|
-
MYSQL_SSL_CA= # VERIFY_CA / VERIFY_IDENTITY 必填
|
|
252
|
-
MYSQL_CONNECT_TIMEOUT=10
|
|
253
|
-
MYSQL_QUERY_TIMEOUT_MS=30000
|
|
254
|
-
MYSQL_MAX_ROWS=500
|
|
255
|
-
MYSQL_MAX_CELL_LENGTH=20000
|
|
256
|
-
MYSQL_RESULT_FORMAT=json
|
|
257
|
-
MYSQL_POOL_SIZE=0
|
|
258
|
-
MYSQL_SQL_MODE=TRADITIONAL
|
|
259
|
-
MYSQL_CHARSET=utf8mb4
|
|
260
|
-
MYSQL_COLLATION=utf8mb4_unicode_ci
|
|
261
|
-
# MYSQL_USE_PURE=true # 默认不设置
|
|
262
|
-
MYSQL_RAISE_ON_WARNINGS=false
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
`MYSQL_USE_PURE`(命名配置中为 `use_pure`)默认不设置:Connector/Python 优先使用 C 扩展,加载失败时自动退回纯 Python 实现。只有明确需要时才设置;设为 `false` 会强制要求 C 扩展,扩展不可用时连接直接失败。
|
|
266
|
-
|
|
267
|
-
`MYSQL_SQL_MODE` 与命名配置的 `sql_mode` 会在每次查询的会话中显式设置(空值即设为空模式)。会改变引号或反斜杠语义的模式会被拒绝:`ANSI_QUOTES`、`NO_BACKSLASH_ESCAPES`,以及包含它们的组合模式 `ANSI`、`DB2`、`MAXDB`、`MSSQL`、`ORACLE`、`POSTGRESQL`,因为只读 SQL 闸门按 MySQL 默认规则识别字符串边界。
|
|
268
|
-
|
|
269
|
-
### Streamable HTTP 传输(推荐)
|
|
270
|
-
|
|
271
|
-
DeepSeek Harness 等新客户端可直接连接标准 MCP Streamable HTTP 端点:
|
|
272
|
-
|
|
273
|
-
```bash
|
|
274
|
-
MCP_TRANSPORT=streamable-http
|
|
275
|
-
MCP_HTTP_HOST=127.0.0.1
|
|
276
|
-
MCP_HTTP_PORT=8000
|
|
277
|
-
MCP_HTTP_PATH=/mcp
|
|
278
|
-
MCP_HTTP_ALLOWED_HOSTS=localhost:8000,127.0.0.1:8000
|
|
279
|
-
MCP_HTTP_BEARER_TOKEN= # 可选,至少 32 个字符
|
|
280
|
-
MCP_HTTP_TRUST_PROXY_AUTH=false # 仅在认证反向代理是唯一入口时启用
|
|
281
|
-
MCP_HTTP_SESSION_IDLE_TIMEOUT_SECONDS=1800
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
`MCP_TRANSPORT` 支持 `stdio`、`sse`、`streamable-http`(及别名 `http`);
|
|
285
|
-
未知值会在启动时直接报错,避免配置拼写错误被静默降级为 STDIO。
|
|
286
|
-
HTTP/SSE 端口必须在 `1-65535` 范围内;会话空闲超时必须为正有限数。
|
|
287
|
-
|
|
288
|
-
默认端点是 `http://127.0.0.1:8000/mcp`。非回环地址只有在启用 Bearer
|
|
289
|
-
认证,或显式确认由认证反向代理保护时才允许启动。
|
|
290
|
-
|
|
291
|
-
### 旧版 SSE 传输
|
|
292
|
-
|
|
293
|
-
```bash
|
|
294
|
-
MCP_TRANSPORT=sse
|
|
295
|
-
MCP_SSE_HOST=127.0.0.1 # 默认仅监听回环地址
|
|
296
|
-
PORT=8000 # MCP_SSE_PORT 的后备值
|
|
297
|
-
MCP_SSE_ALLOWED_HOSTS= # 允许的 Host,逗号分隔
|
|
298
|
-
MCP_SSE_BEARER_TOKEN= # 可选,至少 32 个字符
|
|
299
|
-
MCP_SSE_TRUST_PROXY_AUTH=false # 仅在认证反向代理是唯一入口时启用
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
旧版端点为 `/sse` 和 `/messages/`,仅用于兼容现有客户端。部署细节见
|
|
303
|
-
[`ENTERPRISE_DEPLOYMENT.md`](ENTERPRISE_DEPLOYMENT.md)。
|
|
304
|
-
|
|
305
|
-
### SSH 隧道
|
|
306
|
-
|
|
307
|
-
```bash
|
|
308
|
-
MYSQL_SSH_ENABLE=false
|
|
309
|
-
MYSQL_SSH_HOST=
|
|
310
|
-
MYSQL_SSH_PORT=22
|
|
311
|
-
MYSQL_SSH_USER=
|
|
312
|
-
MYSQL_SSH_KEY_PATH=
|
|
313
|
-
MYSQL_SSH_REMOTE_HOST=localhost
|
|
314
|
-
MYSQL_SSH_REMOTE_PORT=3306
|
|
315
|
-
MYSQL_LOCAL_PORT=0 # 0 表示自动选择端口,隧道会复用
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### `.env` 文件
|
|
319
|
-
|
|
320
|
-
服务启动时会通过 `python-dotenv` 从进程工作目录及父目录加载 `.env`:
|
|
321
|
-
|
|
322
|
-
```bash
|
|
323
|
-
cp .env.example .env
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Claude Desktop、Codex 等宿主通常从自己的目录启动 MCP 服务,未必能找到项目内 `.env`。这类场景应将 `MYSQL_*` 配置放入 MCP 配置的 `env` 节点,或使用命名配置文件和凭据库。
|
|
327
|
-
|
|
328
|
-
### 多数据库模式
|
|
329
|
-
|
|
330
|
-
未设置 `MYSQL_DATABASE` 时,服务进入多数据库模式:
|
|
331
|
-
|
|
332
|
-
- `list_resources` 返回过滤系统库后的可访问数据库
|
|
333
|
-
- 数据工具通过 `database` 参数或 `database.table` 全限定名选择数据库
|
|
334
|
-
- `USE` 和多语句始终被拦截
|
|
96
|
+
- [配置](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/CONFIGURATION.md):命名连接、结果脱敏、凭据库、逻辑环境路由、传输、SSH 隧道和各客户端配置
|
|
97
|
+
- [工具与提示词](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/TOOLS.md):12 个工具的参数、响应预算、并发控制和可纠正的错误码
|
|
98
|
+
- [常见问题与排障](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/TROUBLESHOOTING.md)
|
|
99
|
+
- [开发与测试](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/TESTING.md)
|
|
100
|
+
- [企业部署](ENTERPRISE_DEPLOYMENT.md) · [安全说明](SECURITY.md) · [发布流程](https://github.com/12zhangyan/mysql_mcp_server/blob/main/RELEASING.md) · [使用场景](https://github.com/12zhangyan/mysql_mcp_server/blob/main/MCP_USECASES.md)
|
|
335
101
|
|
|
336
102
|
## 可用工具
|
|
337
103
|
|
|
338
|
-
所有工具都声明 `readOnlyHint=true` 和 `destructiveHint=false
|
|
339
|
-
|
|
340
|
-
### `list_connections`
|
|
341
|
-
|
|
342
|
-
列出命名配置、默认数据库、策略限制和就绪状态,不返回主机、用户名、密码或 SSH 私钥路径。还会返回数据库路由索引和逻辑环境别名。
|
|
343
|
-
|
|
344
|
-
### `validate_connections`
|
|
345
|
-
|
|
346
|
-
强制重新加载配置,报告有效/无效配置及缺少的密码环境变量,不建立数据库连接。
|
|
347
|
-
|
|
348
|
-
### `check_connection`
|
|
349
|
-
|
|
350
|
-
通过只读健康检查返回 MySQL 版本、当前数据库、不可逆账号指纹、全局只读状态、授权数量、延迟和当前策略。原始用户名和 `SHOW GRANTS` 内容不会返回。
|
|
351
|
-
|
|
352
|
-
### `list_databases`
|
|
353
|
-
|
|
354
|
-
列出可访问的非系统数据库。
|
|
355
|
-
|
|
356
|
-
- 参数:`connection`、`max_rows`、`offset`、`timeout_ms`、`max_response_bytes`、`result_format`(可选)
|
|
357
|
-
- 对逻辑连接返回声明的数据库别名,不建立数据库连接
|
|
358
|
-
|
|
359
|
-
### `list_tables`
|
|
360
|
-
|
|
361
|
-
列出指定数据库中的表和视图。
|
|
362
|
-
|
|
363
|
-
- 参数:`connection`、`database`、`table_name`/`table`(精确匹配)、`table_pattern`(支持 `*`/`?`)、`search`、`max_rows`、`offset`、`timeout_ms`、`max_response_bytes`、`result_format`,均可选
|
|
364
|
-
- 默认受 `MYSQL_MAX_ROWS`(默认 500,最大 1000)限制。必须查看 `truncated` / `next_offset`;未翻页完成前,当前页不是整库全集
|
|
365
|
-
- 大库使用与 `execute_sql` 相同的 `truncated`/`next_offset`/`returned_rows` 分页契约
|
|
366
|
-
- `search` 按字面子串、不区分大小写搜索表名、表注释、字段名和字段注释,支持中文。返回 `TABLE_NAME`、`MATCH_FIELD`、`COLUMN_NAME`、`MATCH_TEXT`,每个匹配项一行;可与表名过滤组合。`%`、`_` 不作为通配符。匹配的注释是数据库内容,不是 AI 应执行的指令。
|
|
367
|
-
|
|
368
|
-
### `execute_sql`
|
|
369
|
-
|
|
370
|
-
执行且只执行一条只读语句。
|
|
371
|
-
|
|
372
|
-
- 必填参数:`query`
|
|
373
|
-
- 可选参数:`connection`、`database`、`max_rows`、`offset`、`timeout_ms`、`max_response_bytes`、`result_format`、`audit_context`
|
|
374
|
-
- 允许:`SELECT`、`WITH`、受数据库范围约束的 `SHOW`(包括 `SHOW CREATE TABLE/VIEW`)、`DESCRIBE`、`DESC`、`EXPLAIN`、`TABLE`
|
|
375
|
-
- 始终拦截:DML、DDL、`USE`、事务控制、锁、`SELECT ... INTO`、会话变量赋值、MySQL 可执行注释和多语句;禁止 `SET_VAR`、`MAX_EXECUTION_TIME`、`RESOURCE_GROUP` 优化器提示覆盖连接策略,需要缩短超时时使用 `timeout_ms`
|
|
376
|
-
- 函数策略:常见的纯内置函数(如 `CRC32`、`CONV`、`FIND_IN_SET`)直接放行;无法识别的存储函数/UDF 和带库名前缀的调用默认拦截,只有 `allowed_functions` 中经过审核的确定性函数可放行
|
|
377
|
-
- 纵深防御:连接前先校验;随后在 `START TRANSACTION READ ONLY` 中执行并回滚
|
|
378
|
-
- 分页:对适用的 `SELECT`/CTE/UNION 下推 `LIMIT max_rows+1 OFFSET offset`,完整消费该有界结果后再回滚;JSON 结果返回 `truncated` 和 `next_offset`
|
|
379
|
-
- 跨库:使用 `database` 参数或 `database.table` 全限定名
|
|
380
|
-
- 超时/取消:统一限制完整操作、Connector socket 和 MySQL/MariaDB 语句时间;取消请求会关闭活动连接,无需 `KILL` 权限
|
|
381
|
-
- 格式:`json` 保留数据类型和元信息;`csv` 保持原有格式,使用标准引号规则,并明确表示 `NULL`;`compact` 第一行是 JSON 元信息,后面是 CSV 数据,保留目标库、路由、脱敏字段和分页信息。需要区分 SQL NULL 与字符串 `NULL` 时使用 JSON。
|
|
382
|
-
- 审计归因:`audit_context` 支持 `actor`、`purpose`、`ticket_id`,配置可要求调用前必须提供指定字段
|
|
383
|
-
- 临时故障恢复:仅执行/取数阶段的 Connector/Python `InterfaceError(errno=-1)` 保留一次兼容重试。`ReadTimeoutError` / `WriteTimeoutError` 不重放,统一返回 `QUERY_TIMEOUT` 并丢弃活动连接;其他未知 `errno=-1`、表不存在、字段不存在、语法和权限错误不会自动重试。
|
|
384
|
-
- 首次查询或结构不确定时先用 `list_tables` / `get_schema_info` 确认真实名称;每次传入一致的 `connection`、`database`。收到确定性 SQL 错误后核对元数据再改 SQL,不自动换库或改表名执行。
|
|
385
|
-
|
|
386
|
-
### `explain_sql`
|
|
387
|
-
|
|
388
|
-
对原始 `SELECT` / `WITH`(含 UNION)生成普通 `EXPLAIN` 执行计划,便于先检查索引、连接顺序和预估扫描行数。
|
|
389
|
-
|
|
390
|
-
- 必填 `query`,传入原 SQL;不要添加 `EXPLAIN` 前缀。拒绝写语句、多语句和 `EXPLAIN ANALYZE`。
|
|
391
|
-
- 可选参数与 `execute_sql` 一致,复用数据库白名单、函数策略、只读事务、审计、脱敏、超时和响应预算。
|
|
392
|
-
- 保留原 SQL 中的 `LIMIT/OFFSET`;工具参数 `max_rows/offset` 只分页执行计划,避免为诊断修改原查询。
|
|
393
|
-
- 默认 `plan_output=rows` 返回数据库的计划结果,格式取决于服务器设置。保留完整计划单元格,不再受普通数据的 `max_cell_length` 截断;首行超响应预算时明确返回 `RESULT_TOO_LARGE` 并提示切换分片,不交付残缺计划。
|
|
394
|
-
- `plan_output=chunks` 显式请求 `EXPLAIN FORMAT=JSON`;先按原规则脱敏,再把计划文本拆成固定长度的 `part/text` 行。此时 `offset/max_rows` 针对分片,响应仍受 UTF-8 字节预算限制。默认使用 `json`,也可选 `compact`;不接受缺少计划元信息的 `csv`。
|
|
395
|
-
- 第一页保留 `plan.id`。续页传 `offset=next_offset` 和 `expected_plan_id=plan.id`,按 `part` 顺序拼接 `text`,直到 `truncated=false`。分片长度、总字符数和总片数在 `plan` 中。每页重新生成计划;计划、目标或分片上下文变化时返回 `PLAN_CHANGED`,需丢弃旧片段并从 0 重取,避免混合版本。
|
|
396
|
-
- 计划是估算信息,不代表实际执行耗时;工具不会自动建索引、更新统计信息或运行 ANALYZE。分片模式需要服务器支持 `EXPLAIN FORMAT=JSON`,不会自动切换到 ANALYZE 或其他数据库。
|
|
397
|
-
|
|
398
|
-
```json
|
|
399
|
-
{"query":"SELECT id FROM orders WHERE status = 'open' ORDER BY id LIMIT 20","connection":"dev","database":"app_dev","result_format":"json"}
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
### `query`
|
|
403
|
-
|
|
404
|
-
`execute_sql` 的兼容别名,使用相同的只读、白名单、脱敏、超时、分页和审计策略。不会恢复不安全的进程级 `use_connection` 或 `use_database`。
|
|
405
|
-
|
|
406
|
-
### `get_schema_info`
|
|
407
|
-
|
|
408
|
-
返回数据库结构详情,包括字段名、类型、可空性、默认值和注释。
|
|
409
|
-
|
|
410
|
-
- 参数:`table_name` 或兼容别名 `table`,以及 `connection`、`database`
|
|
411
|
-
- 支持 `table_pattern`(与 `list_tables` 相同的 `*`/`?` glob)或 `table_names` 批量指定 1–100 张当前库的表;与 `table_name`/`table` 三者互斥。超过 100 张表会报错,不会静默截断名单。
|
|
412
|
-
- 整库或批量模式也支持 `max_rows`、`offset`、`max_response_bytes`、`timeout_ms`、`result_format`。默认页大小为连接的 `MYSQL_MAX_ROWS`。必须查看 `truncated` / `next_offset`;未把 `truncated` 翻到 `false` 前,不得把当前页当作整库列全集。
|
|
413
|
-
- `detail=true` 一次返回表注释、字段完整类型/默认值/可空性/附加属性/注释、索引(含 PRIMARY、列顺序、前缀长度、唯一性)及已声明的外键。结果按 `KIND` 区分 `table`、`column`、`index`、`foreign_key`;每个索引列或外键列独立成行,不用字符串聚合,避免结构信息被静默截断。不会猜测未声明的业务关联。
|
|
414
|
-
- 可用 `database.table` 访问允许列表中的其他数据库
|
|
415
|
-
- 同时传 `database` 和限定表名时,两者必须一致。保留相同参数并递增 `offset=next_offset`,直到 `truncated=false`。
|
|
416
|
-
- 标识符只允许字母、数字、下划线、`$`,数据库与表之间允许一个点
|
|
417
|
-
|
|
418
|
-
### `get_table_sample`
|
|
419
|
-
|
|
420
|
-
返回具有代表性的少量样例数据。
|
|
421
|
-
|
|
422
|
-
- `table_name` 或兼容别名 `table` 必须提供一个
|
|
423
|
-
- 可选参数:`limit`(最大 100)、`offset`、`connection`、`database`、`timeout_ms`、`max_response_bytes`、`result_format`
|
|
424
|
-
- 采样会在 MySQL 中应用 `LIMIT limit+1 OFFSET offset` 并完整消费小结果集,不会为了返回几行数据而开启无界扫描结果
|
|
425
|
-
|
|
426
|
-
### `inspect_catalog`
|
|
427
|
-
|
|
428
|
-
返回 `tables`、`columns`、`indexes`、`constraints`、`foreign_keys` 或 `views` 的固定元数据投影。该工具不会开放任意 `information_schema` SQL。
|
|
429
|
-
|
|
430
|
-
- 过滤:`table_name`/`table` 精确匹配,或 `table_pattern`,或最多 100 个 `table_names`,三者互斥。不传表过滤时,对该 database 的 `kind` 投影做稳定排序后分页。列排序为 `TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME`。
|
|
431
|
-
- 分页:`max_rows`(1..连接上限,默认 `MYSQL_MAX_ROWS`)和 `offset`(默认 0)。JSON/`compact` 返回 `truncated`、`next_offset`(无下一页为 `null`)、`returned_rows`。`offset` 会下推为 SQL `LIMIT`/`OFFSET`。
|
|
432
|
-
- 指定单表时仍尊重 `max_rows`/`offset`。旧调用不传这些参数时等价于 `offset=0`,仍可能 `truncated=true`。
|
|
433
|
-
- 未翻页完成前,不得把当前页当作整库全集。续查时保持 `kind` 和过滤条件不变,只把 `offset` 换成上一页的 `next_offset`。
|
|
434
|
-
|
|
435
|
-
### `dump_schema`
|
|
436
|
-
|
|
437
|
-
按表分组返回允许列表内的表/列元数据,便于用少量调用拉完 600+ 张表的列结构。
|
|
438
|
-
|
|
439
|
-
- 参数:`connection`、`database`、`kinds`(仅 `tables` 和/或 `columns`,默认两者都要)、以及与 `inspect_catalog` 相同的表过滤和分页参数
|
|
440
|
-
- 出参为 JSON:`tables[].table_name`、可选表级字段、`columns[]`(`name`/`type`/`nullable`/`default`/`comment`/`ordinal`/`extra`),外加 `truncated`/`next_offset`/`returned_rows`
|
|
441
|
-
- 分页作用在底层列(或仅 `tables` 时的表)行上;单表列可能跨页出现,合并时按 `(table_name, ordinal/name)` 去重。响应过大时会继续截断并设置 `truncated=true`,不会静默丢列
|
|
442
|
-
- `indexes`/`constraints`/`foreign_keys`/`views` 请继续用 `inspect_catalog` 分页拉取
|
|
443
|
-
|
|
444
|
-
### 查询响应预算与并发控制
|
|
445
|
-
|
|
446
|
-
以下参数可写在命名连接中,也可使用对应的环境变量:
|
|
447
|
-
|
|
448
|
-
| 配置 | 环境变量 | 默认值 | 范围 |
|
|
449
|
-
| --- | --- | --- | --- |
|
|
450
|
-
| `max_response_bytes` | `MYSQL_MAX_RESPONSE_BYTES` | 262144 | 4096–4194304 |
|
|
451
|
-
| `max_concurrent_queries` | `MYSQL_MAX_CONCURRENT_QUERIES` | 5 | 1–32 |
|
|
452
|
-
| `max_queued_queries` | `MYSQL_MAX_QUEUED_QUERIES` | 16 | 0–128 |
|
|
453
|
-
| `queue_timeout_ms` | `MYSQL_QUEUE_TIMEOUT_MS` | 1000 | 1–300000 |
|
|
454
|
-
|
|
455
|
-
查询数据响应按最终文本的 UTF-8 字节数(含结果元信息)控制;预算不包含 MCP/HTTP 外层封装,不是数据库扫描量或进程内存上限。单次 `max_response_bytes` 只能降低连接配置的预算。按完整行截断后,`next_offset` 指向下一条尚未交付的记录;表头或首行超预算时返回 `RESULT_TOO_LARGE`,需要减少列或用 `SUBSTRING` 分段取内容,不跳过该行。
|
|
456
|
-
|
|
457
|
-
`truncated` 表示还有未交付的行;`content_truncated` 表示有单元格被 `max_cell_length` 截断。`truncation_reasons` 区分 `row_limit`、`response_bytes` 和 `cell_length`。单元格内容截断不能靠翻到下一行恢复。分页 SQL 应使用稳定、唯一的 `ORDER BY`;各页是独立只读事务,并发数据变化时不保证跨页快照一致。
|
|
458
|
-
|
|
459
|
-
并发按实际连接别名隔离;启用连接池时并发上限不超过池大小。队列满或等候超过 `queue_timeout_ms` 返回 `CONNECTION_BUSY`,建议降低并行度后短暂等待再调用。`timeout_ms` 包含排队与执行,JSON/compact 返回 `queue_wait_ms`。取消请求会关闭活动 socket,工作线程完成清理前继续占用并发名额。
|
|
460
|
-
|
|
461
|
-
### 可纠正的查询错误
|
|
462
|
-
|
|
463
|
-
数据库错误通过 MCP `isError=true` 返回,文本为 JSON,同时提供 `structuredContent`。字段包含 `code`、`message`、`retryable`、`next_action`、安全的错误码/阶段、实际连接/库、请求的连接/库、`route_applied` 和 `query_id`。不透传驱动原始错误、SQL 文本、密码或主机连接信息。
|
|
464
|
-
|
|
465
|
-
- `SQL_PARSE_ERROR`:连接前解析失败;只返回固定消息、可用的数字行列位置和查询指纹,不回显 SQL、字面量、解析器上下文或 ANSI 高亮。
|
|
466
|
-
- `TABLE_NOT_FOUND`:1146/1109,先核对目标库并发现真实表名。
|
|
467
|
-
- `COLUMN_NOT_FOUND`:1054,检查字段和别名。
|
|
468
|
-
- `SQL_SYNTAX_ERROR`:1064,核对 MySQL 语法。
|
|
469
|
-
- `DATABASE_NOT_FOUND`、`AUTHENTICATION_FAILED`、`ACCESS_DENIED`:核对配置和只读权限。
|
|
470
|
-
- `QUERY_TIMEOUT`:MySQL 3024、MariaDB 1969、驱动读写超时或本地完整调用截止时间;先缩小查询范围或用 `explain_sql` 检查计划,不直接重复昂贵查询。本地截止时间使用 `phase=deadline` 并携带 `timeout_ms`。
|
|
471
|
-
- `LOCK_WAIT_TIMEOUT` / `DEADLOCK`:1205 / 1213,检查并发事务或 DDL,在阻塞缓解后有限退避重试。
|
|
472
|
-
- `CONNECTION_FAILED` / `CONNECTION_LOST`:连接建立失败或结果接收中断;先核对网络和目标连接,中断结果不得当作完整结果。
|
|
473
|
-
- `QUERY_INTERRUPTED`:1317,先确认取消原因,不自动重新执行。
|
|
474
|
-
- `CONNECTION_BUSY`:本地队列拥塞,或 MySQL 1040/1203 连接数超限;降低并发后有限退避重试,不会自动切换环境。
|
|
475
|
-
- `retryable=true` 表示恢复后可由调用方有限重试,不会触发本服务新增自动重放;未知主机 2005、查询超时及主动中断均为 `false`。
|
|
476
|
-
- `RESULT_TOO_LARGE`:普通查询缩小字段投影后从原 offset 重查;执行计划改用 `plan_output=chunks` 从 0 获取。
|
|
477
|
-
- `PLAN_CHANGED`:计划续页指纹不一致,丢弃已收集分片并从 0 重取;`PLAN_FORMAT_UNSUPPORTED` 表示服务器没有返回预期的单行 JSON 计划。
|
|
478
|
-
|
|
479
|
-
示例调用:
|
|
480
|
-
|
|
481
|
-
```json
|
|
482
|
-
{"connection":"dev","database":"app_dev","search":"调拨","max_rows":20,"result_format":"compact"}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
上例用于 `list_tables`;取得真实表名后,可用 `get_schema_info` 的 `table_names` 和 `detail=true` 批量查看结构。
|
|
486
|
-
|
|
487
|
-
### 常见问题
|
|
488
|
-
|
|
489
|
-
- 提示 `auto mode classifier gave no verdict`:来自 Claude Code 的权限分类器,不是 SQL 错误,也不是本服务返回的。原样重试即可;常用的只读工具可在客户端权限设置里放行。
|
|
490
|
-
- 查询 `information_schema` 被拒:设计如此,请改用 `get_schema_info`、`inspect_catalog` 或 `list_tables`。
|
|
491
|
-
- `timeout_ms` 被拒:它不能超过该连接的 `query_timeout_ms`(`list_connections` 可查,配置上限 300000)。需要更长时间时由部署方调整对应连接。
|
|
492
|
-
- 某个库查不到:先看 `list_connections` 的 `allowed_databases` 和 `database_routes`,库不在连接的范围内就不能访问。
|
|
493
|
-
- 函数被拒:内置的纯函数已放行;被拒的多为存储函数、UDF 或带库名前缀的调用,审核确认无副作用后加入该连接的 `allowed_functions`。
|
|
494
|
-
- 字段注释显示乱码:先在 MySQL 客户端对照同一列;若客户端也乱码,是库里存储的编码问题,与本服务的读取无关。
|
|
495
|
-
- 其他 MCP 服务(如 `ssh-mcp-server`)连接失败:与本服务无关,检查它自己的启动配置。
|
|
496
|
-
|
|
497
|
-
## 可用提示词
|
|
498
|
-
|
|
499
|
-
| 提示词 | 参数 | 说明 |
|
|
500
|
-
| --- | --- | --- |
|
|
501
|
-
| `explore_database` | `connection`、`database`(可选) | 依次发现表、检查结构、采样并总结数据库 |
|
|
502
|
-
| `analyze_table` | `table_name`(必填)、`connection`、`database`(可选) | 深入分析指定表,支持 `database.table` |
|
|
503
|
-
|
|
504
|
-
这些提示词只编排只读的发现、结构检查和采样工具。
|
|
505
|
-
|
|
506
|
-
## MCP 客户端配置
|
|
507
|
-
|
|
508
|
-
### Claude Desktop
|
|
509
|
-
|
|
510
|
-
在 `claude_desktop_config.json` 中加入:
|
|
511
|
-
|
|
512
|
-
```json
|
|
513
|
-
{
|
|
514
|
-
"mcpServers": {
|
|
515
|
-
"mysql-readonly": {
|
|
516
|
-
"command": "npx",
|
|
517
|
-
"args": ["-y", "@yanzhang123/readonly-db-mcp@0.9.1"],
|
|
518
|
-
"env": {
|
|
519
|
-
"MYSQL_PROFILES_FILE": "C:/absolute/path/mysql-connections.toml",
|
|
520
|
-
"MYSQL_DEV_PASSWORD": "your_dev_password"
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### Visual Studio Code / Codex
|
|
528
|
-
|
|
529
|
-
在 `mcp.json` 或对应 MCP 配置中加入:
|
|
530
|
-
|
|
531
|
-
```json
|
|
532
|
-
{
|
|
533
|
-
"mcpServers": {
|
|
534
|
-
"mysql-readonly": {
|
|
535
|
-
"type": "stdio",
|
|
536
|
-
"command": "npx",
|
|
537
|
-
"args": ["-y", "@yanzhang123/readonly-db-mcp@0.9.1"],
|
|
538
|
-
"env": {
|
|
539
|
-
"MYSQL_PROFILES_FILE": "C:/absolute/path/mysql-connections.toml",
|
|
540
|
-
"MYSQL_DEV_PASSWORD": "your_dev_password"
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
Windows 宿主如无法解析 `npx`,改用 `npx.cmd`。更多调用场景见 [`MCP_USECASES.md`](MCP_USECASES.md)。
|
|
548
|
-
|
|
549
|
-
### DeepSeek Harness
|
|
550
|
-
|
|
551
|
-
Harness 自带 `@deepseek-ai/dsh-mcp-client`。本地使用推荐挂载 npm 包的
|
|
552
|
-
STDIO 入口;在 Windows 上使用 `npx.cmd`:
|
|
553
|
-
|
|
554
|
-
```yaml
|
|
555
|
-
- insert:
|
|
556
|
-
- id: mcp-mysql-readonly
|
|
557
|
-
name: '@deepseek-ai/dsh-mcp-client'
|
|
558
|
-
config:
|
|
559
|
-
serverName: mysql-readonly
|
|
560
|
-
transport: stdio
|
|
561
|
-
command: npx.cmd
|
|
562
|
-
args: ['-y', '@yanzhang123/readonly-db-mcp@0.9.1']
|
|
563
|
-
env:
|
|
564
|
-
MYSQL_PROFILES_FILE: 'C:/absolute/path/mysql-connections.toml'
|
|
565
|
-
toolCallTimeoutMs: 60000
|
|
566
|
-
failOnStartupError: true
|
|
567
|
-
```
|
|
568
|
-
|
|
569
|
-
远程或集中部署时使用 Streamable HTTP。先按上文启动服务,然后在 Harness
|
|
570
|
-
配置中挂载端点;`MYSQL_MCP_AUTHORIZATION` 的值应为 `Bearer <token>`,并
|
|
571
|
-
从进程环境或密钥管理系统注入,不要提交到仓库:
|
|
572
|
-
|
|
573
|
-
```yaml
|
|
574
|
-
- insert:
|
|
575
|
-
- id: mcp-mysql-readonly
|
|
576
|
-
name: '@deepseek-ai/dsh-mcp-client'
|
|
577
|
-
config:
|
|
578
|
-
serverName: mysql-readonly
|
|
579
|
-
transport: streamable-http
|
|
580
|
-
url: 'https://mcp.example.com/mcp'
|
|
581
|
-
headers:
|
|
582
|
-
Authorization: !!js process.env.MYSQL_MCP_AUTHORIZATION
|
|
583
|
-
toolCallTimeoutMs: 60000
|
|
584
|
-
failOnStartupError: true
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
## 开发与测试
|
|
588
|
-
|
|
589
|
-
```bash
|
|
590
|
-
git clone https://github.com/12zhangyan/mysql_mcp_server.git
|
|
591
|
-
cd mysql_mcp_server
|
|
592
|
-
python -m venv .venv
|
|
593
|
-
|
|
594
|
-
# Linux/macOS
|
|
595
|
-
source .venv/bin/activate
|
|
596
|
-
|
|
597
|
-
# Windows PowerShell
|
|
598
|
-
.\.venv\Scripts\Activate.ps1
|
|
599
|
-
|
|
600
|
-
pip install -r requirements-dev.txt
|
|
601
|
-
pytest
|
|
602
|
-
npm test
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
调试 MCP 协议交互时可使用 MCP Inspector,不建议直接把 Python 进程当作普通命令行程序交互。
|
|
104
|
+
所有工具都声明 `readOnlyHint=true` 和 `destructiveHint=false`。参数和行为详见 [工具与提示词](https://github.com/12zhangyan/mysql_mcp_server/blob/main/docs/TOOLS.md)。
|
|
606
105
|
|
|
607
|
-
|
|
106
|
+
| 工具 | 用途 |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| `list_connections` / `validate_connections` / `check_connection` | 列出命名连接、重载并校验配置、只读健康检查 |
|
|
109
|
+
| `list_databases` / `list_tables` | 列出可访问的数据库、表和视图 |
|
|
110
|
+
| `execute_sql` / `query` | 执行单条只读语句(`query` 是兼容别名) |
|
|
111
|
+
| `explain_sql` | 对 `SELECT` / `WITH` 生成执行计划 |
|
|
112
|
+
| `get_schema_info` / `inspect_catalog` / `dump_schema` | 字段、索引、约束、视图等元数据,支持分页和整库导出 |
|
|
113
|
+
| `get_table_sample` | 返回少量样例数据 |
|
|
608
114
|
|
|
609
115
|
## 安全设计
|
|
610
116
|
|
|
Binary file
|
package/package.json
CHANGED
|
Binary file
|