
数据库 MCP 实战:MySQL/PostgreSQL/SQLite 自然语言查询 ------ 让 AI 替你写 SQL,一问即知
不会写复杂的 JOIN?记不住聚合函数?现在,你只需用中文问"上个季度销售额最高的产品是什么",AI 就能自动生成 SQL、查询数据库、返回图表。本文带你用 MCP 协议打通数据库,实现自然语言零代码查询。
前言:告别 SQL 语法焦虑
在日常工作和数据分析中,我们经常需要从数据库里捞数据。但现实是:
- 业务人员不懂 SQL,每次都得麻烦开发或数据团队
- 简单的查询也要写半天,尤其是多表关联和日期处理
- 想做个报表,要先写 SQL,再导出 Excel,再画图......
现在,数据库 MCP Server 来了。它将数据库的表结构、字段信息暴露给 AI 模型,让 AI 能够理解你的自然语言问题,自动生成 SQL 并执行,最后用自然语言或图表回给你。
本文将以实践为导向,详细讲解如何为 PostgreSQL、MySQL、SQLite 配置 MCP Server,实现自然语言查询、统计分析和自动报表生成。同时,我们会强调安全性------只读账号、禁止删除等关键配置,以及如何将数据库查询封装成 Skill,实现自动化报表。
全文包含 6 张 mermaid 流程图 和大量可复用的代码配置,助你快速搭建"AI 数据助手"。
1. 数据库 MCP 通用配置
1.1 什么是数据库 MCP Server?
数据库 MCP Server 是一个实现了 MCP 协议的中间件,它连接实际的数据库(PostgreSQL/MySQL/SQLite),并对外暴露一组标准化的工具(Tools),例如:
| 工具名 | 功能 |
|---|---|
query |
执行只读 SQL 查询 |
list_tables |
列出所有表名和注释 |
describe_table |
查看表结构(字段、类型、主键) |
get_schema |
获取完整数据库架构(用于 AI 理解) |
explain_query |
分析 SQL 执行计划 |
AI 智能体(如 Hermes、Cursor、Claude Desktop)作为 MCP Client,可以调用这些工具,从而实现自然语言 → SQL → 结果 → 解释 的闭环。
1.2 通用配置架构
渲染错误: Mermaid 渲染失败: Parse error on line 6: ...据| M M -->|查询结果 (JSON)| A A -->| ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
1.3 安装通用依赖
大多数数据库 MCP Server 基于 Node.js 或 Python。推荐使用官方提供的 @modelcontextprotocol/server-* 系列包。首先确保安装了 Node.js 18+ 和 npx:
bash
# 安装 Node.js (Ubuntu/Debian)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# 验证
node --version
npm --version
1.4 通用配置结构(用于 Hermes)
在 Hermes 的 config.yaml 中,每个数据库 MCP Server 的配置遵循以下模板:
yaml
mcp:
enabled: true
servers:
- name: postgres
transport: stdio
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres", "postgresql://user:pass@localhost/dbname"]
allowed_tools:
- query
- list_tables
- describe_table
# 不允许执行写操作(由 Server 端强制只读)
- name: mysql
transport: stdio
command: "npx"
args: ["-y", "@modelcontextprotocol/server-mysql", "mysql://user:pass@localhost/dbname"]
- name: sqlite
transport: stdio
command: "npx"
args: ["-y", "@modelcontextprotocol/server-sqlite", "/path/to/database.db"]
⚠️ 安全提示 :生产环境请务必使用 只读数据库账号 ,并设置
allowed_tools白名单,避免 AI 意外执行DROP、DELETE等命令。
2. PostgreSQL 接入示例
2.1 环境准备
假设你已有一个 PostgreSQL 数据库(本地或云)。如果还没有,可以快速启动一个测试实例:
bash
docker run --name test-pg -e POSTGRES_PASSWORD=test123 -e POSTGRES_DB=testdb -p 5432:5432 -d postgres:15
创建测试表和样本数据:
sql
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
sale_date DATE,
amount DECIMAL(10,2),
quantity INT
);
INSERT INTO sales (product_name, category, sale_date, amount, quantity) VALUES
('机械键盘', '电子产品', '2025-01-15', 299.00, 2),
('无线鼠标', '电子产品', '2025-01-20', 89.00, 5),
('笔记本支架', '办公', '2025-01-25', 129.00, 3),
('机械键盘', '电子产品', '2025-02-10', 299.00, 1),
('USB扩展坞', '电子产品', '2025-02-18', 199.00, 2),
('笔记本支架', '办公', '2025-02-22', 129.00, 2);
2.2 PostgreSQL MCP Server 配置
使用官方 server-postgres(需 Node.js):
yaml
# ~/.hermes/config.yaml 片段
mcp:
servers:
- name: pg_analytics
transport: stdio
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres", "postgresql://postgres:test123@localhost:5432/testdb"]
allowed_tools:
- query
- list_tables
- describe_table
如果数据库需要 SSL 或特殊参数,可以在连接字符串后添加:
bash
"postgresql://user:pass@host:port/db?sslmode=require"
2.3 启动 Hermes 并测试
确保 Hermes 启用了 MCP,然后发送自然语言请求:
用户: "查询 2025 年 1 月的总销售额"
Hermes 内部流程:
- 调用
list_tables了解有哪些表 - 调用
describe_table sales了解字段含义 - 生成 SQL:
SELECT SUM(amount) FROM sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-01-31'; - 通过
query工具执行 - 将数字结果转换为自然语言:"2025 年 1 月总销售额为 517.00 元。"
2.4 验证效果
你可以通过 /mcp call pg_analytics query 手动测试:
bash
# 通过 Hermes 内置命令(如果支持)
/mcp call pg_analytics query --sql "SELECT product_name, SUM(quantity) FROM sales GROUP BY product_name"
应返回类似:
产品名称 | 总销量
机械键盘 | 3
无线鼠标 | 5
笔记本支架 | 5
USB扩展坞 | 2
2.5 PostgreSQL MCP 调用流程图
PostgreSQL PostgreSQL MCP Hermes User PostgreSQL PostgreSQL MCP Hermes User "一月份卖得最好的产品是什么?" list_tables ["sales"] describe_table sales 字段: product_name, sale_date, quantity... 生成 SQL: SELECT product_name, SUM(quantity) as total FROM sales WHERE sale_date BETWEEN... GROUP BY product_name ORDER BY total DESC LIMIT 1 query(sql) 执行 SELECT 结果行: ("机械键盘", 3) JSON 结果 "1月份销量最好的产品是机械键盘,共卖出3件。"
3. MySQL 接入示例
3.1 MySQL 环境准备
启动 MySQL 容器:
bash
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=root123 -e MYSQL_DATABASE=company -p 3306:3306 -d mysql:8
创建测试数据:
sql
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
INSERT INTO employees (name, department, salary, hire_date) VALUES
('张三', '技术部', 15000, '2023-01-10'),
('李四', '技术部', 18000, '2022-05-20'),
('王五', '市场部', 12000, '2023-08-15'),
('赵六', '市场部', 11000, '2024-01-05'),
('孙七', '产品部', 14000, '2023-11-01');
3.2 MySQL MCP Server 配置
官方提供了 @modelcontextprotocol/server-mysql,使用前需安装:
bash
npm install -g @modelcontextprotocol/server-mysql
然后配置 Hermes:
yaml
mcp:
servers:
- name: mysql_hr
transport: stdio
command: "mcp-server-mysql" # 全局安装后可直接调用
args: ["mysql://root:root123@localhost:3306/company"]
allowed_tools:
- query
- list_tables
- describe_table
注:某些版本的 MySQL MCP Server 可能要求使用
mysql2协议,连接字符串格式为mysql://user:pass@host:port/db。
3.3 自然语言查询实战
用法与 PostgreSQL 完全一致。以下是一些示例问题及预期行为:
| 用户问题 | AI 生成的 SQL(示例) |
|---|---|
| "技术部平均工资多少?" | SELECT AVG(salary) FROM employees WHERE department='技术部'; |
| "按部门统计人数和平均薪资" | SELECT department, COUNT(*), AVG(salary) FROM employees GROUP BY department; |
| "入职最晚的三位员工" | SELECT name, hire_date FROM employees ORDER BY hire_date DESC LIMIT 3; |
输出示例(自然语言):
"技术部平均工资为 16500 元,共有 2 人;市场部平均工资 11500 元,共 2 人;产品部 14000 元,共 1 人。"
3.4 处理复杂查询
AI 会自动根据表结构和字段名推断关系。例如用户问:"哪个部门总薪资支出最高?" AI 会生成:
sql
SELECT department, SUM(salary) as total
FROM employees
GROUP BY department
ORDER BY total DESC
LIMIT 1;
返回:"技术部总薪资支出最高,为 33000 元。"
4. SQLite 本地接入
4.1 SQLite 特点
SQLite 是嵌入式数据库,无需单独服务进程,非常适合本地开发、轻量级数据分析或作为 AI 的记忆存储。MCP 官方提供了 server-sqlite。
4.2 准备 SQLite 数据
创建文件 company.db 并导入数据:
bash
sqlite3 company.db
sql
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT,
price REAL,
stock INTEGER
);
INSERT INTO products (name, price, stock) VALUES
('iPhone 15', 5999, 50),
('MacBook Air', 8999, 30),
('AirPods Pro', 1899, 100);
4.3 配置 SQLite MCP Server
yaml
mcp:
servers:
- name: sqlite_local
transport: stdio
command: "npx"
args: ["-y", "@modelcontextprotocol/server-sqlite", "/home/user/company.db"]
allowed_tools:
- query
- list_tables
- describe_table
注意路径需要使用绝对路径。
4.4 自然语言查询示例
用户问:"库存价值最高的产品是哪款?" AI 会:
- 查看
products表结构(price, stock) - 计算价值:
price * stock - 生成 SQL:
SELECT name, price*stock AS value FROM products ORDER BY value DESC LIMIT 1; - 返回:"库存价值最高的产品是 MacBook Air,价值 269970 元。"
4.5 SQLite 的优势场景
- AI 本地缓存:存储对话历史、用户偏好,不依赖网络
- 轻量数据分析:CSV 导入 SQLite,让 AI 做复杂查询
- 原型验证:无需安装数据库服务器
5. 自然语言查询、统计、生成报表
5.1 从简单查询到复杂统计
数据库 MCP 不只是执行单条 SQL。结合 AI 的推理能力,可以实现:
1. 多步查询分解
用户问:"去年销量最高的产品今年还在卖吗?" AI 可能拆成两步:
- 查询去年销量最高的产品名
- 查询该产品在当前年份是否有销售记录
2. 自动时间范围处理
用户说"上个季度",AI 会根据当前日期自动计算出上季度的起止日期。
3. 跨表关联
如果数据库有 orders 和 customers 表,AI 可以自动识别外键并生成 JOIN。
4. 生成报表(表格或图表)
Hermes 可以将查询结果渲染为 Markdown 表格,甚至调用 image_gen 工具生成柱状图。
5.2 报表生成示例
用户:
生成各部门薪资分布饼图
AI 查询
部门+薪资总和
返回 JSON 数据
调用 image_gen 工具
生成饼图图片
发送给用户
5.3 自然语言 → SQL 效果评估
根据实际测试,采用 GPT-4 级别模型时:
- 简单单表查询(过滤、聚合、排序):准确率 >95%
- 两表 JOIN:准确率 ~85%
- 复杂子查询或窗口函数:可能需要人工校正
建议在使用前,通过 MCP 的 get_schema 将完整表结构和注释提供给 AI,可大幅提升准确率。
6. 安全:只读账号、禁止删除
6.1 核心风险
让 AI 执行任意 SQL 存在风险:
- 恶意注入(虽然 AI 模型通常不会主动破坏,但可能误解用户意图)
- 意外执行
DELETE或DROP(例如用户说"删除去年的数据",AI 可能真的执行) - 循环或大查询导致数据库过载
6.2 解决方案:使用只读账号
PostgreSQL 只读用户:
sql
CREATE USER readonly WITH PASSWORD 'strong_password';
GRANT CONNECT ON DATABASE testdb TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
MySQL 只读用户:
sql
CREATE USER 'readonly'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT ON company.* TO 'readonly'@'%';
FLUSH PRIVILEGES;
SQLite:可以使用只读模式打开数据库文件:
bash
sqlite3 file.db?mode=ro
在 MCP Server 连接字符串中可能不支持,可以采用文件系统权限(chmod 444)。
6.3 MCP Server 层面限制
官方数据库 MCP Server 默认只允许 SELECT 查询,但仍然建议在配置中限制工具:
yaml
allowed_tools:
- query
- list_tables
- describe_table
# 不要包含 execute_write 或类似工具
6.4 额外安全措施
- 启用查询超时:通过数据库配置或 MCP Server 参数限制每个查询的执行时间(例如 10 秒)。
- 设置结果集上限 :限制返回行数(默认 100 行),防止
SELECT * FROM huge_table。 - 审计日志:记录所有查询语句,便于事后审查。
- 禁止 DDL/DML:在数据库端通过触发器或权限彻底封杀。
6.5 安全架构图
SELECT
INSERT/UPDATE/DELETE/DROP
用户自然语言请求
AI 生成 SQL
检查 SQL 类型
使用只读账号执行
拒绝执行并提示
返回结果
返回错误信息
限制结果集 ≤ 100行
记录审计日志
7. 配合 Skill 做自动化报表
7.1 将数据库查询封装为 Skill
我们可以创建一个 Skill,让用户只需说"生成周报",AI 就自动执行一组预定义的 SQL 查询,并汇总成报告。
Skill 定义示例 (weekly_report.yaml):
yaml
name: weekly_report
description: "生成本周销售周报,包含总销售额、热门产品和分类统计"
trigger: "生成周报|本周销售报告"
steps:
- tool: mcp_call
params:
server: pg_analytics
tool: query
sql: |
SELECT SUM(amount) AS total_sales
FROM sales
WHERE sale_date >= date_trunc('week', CURRENT_DATE)
- output: total_sales
- tool: mcp_call
params:
server: pg_analytics
tool: query
sql: |
SELECT product_name, SUM(quantity) AS qty
FROM sales
WHERE sale_date >= date_trunc('week', CURRENT_DATE)
GROUP BY product_name
ORDER BY qty DESC
LIMIT 5
- output: top_products
- tool: llm_generate
params:
prompt: |
根据以下数据生成周报(中文,友好语气):
总销售额:{{total_sales}}
畅销商品:{{top_products}}
output: report_text
- tool: reply
params:
message: "{{report_text}}"
7.2 定时报表(Cron)
结合 Hermes 的 cronjob,可以每天/每周自动生成报表并推送到 Slack 或邮箱。
配置示例(config.yaml):
yaml
cronjobs:
- name: "monday_sales_report"
schedule: "0 9 * * 1" # 每周一早上 9 点
skill: "weekly_report"
output_channel: "slack"
params:
channel: "#sales-team"
7.3 报表进阶:发送图表
修改 Skill,在最后一步调用 image_gen 工具,将数据转化为柱状图图片,然后发送。
yaml
- tool: mcp_call
params:
server: pg_analytics
tool: query
sql: "SELECT category, SUM(amount) FROM sales ..."
output: cat_data
- tool: image_gen
params:
prompt: "根据数据{{cat_data}}生成柱状图,风格商务"
output: chart_url
- tool: slack_send_file
params:
file_url: "{{chart_url}}"
caption: "上周各类别销售额"
7.4 完整自动化报表流程
渲染错误: Mermaid 渲染失败: Parse error on line 3: ... A1[用户对话触发 "/周报"] A2[定时 ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'STR'
8. 总结:数据查询零代码
8.1 核心价值回顾
通过数据库 MCP + 自然语言接口,你可以:
- 零 SQL 技能:业务人员直接用中文问数据
- 零代码:无需编写 Python/Java 脚本
- 即问即答:秒级获得分析结果
- 自动报表:结合 Skill 和 Cron,实现数据定时推送
8.2 三种数据库选型建议
| 数据库 | 适用场景 | 推荐程度 |
|---|---|---|
| PostgreSQL | 生产数据分析、复杂查询、大数据量 | ⭐⭐⭐⭐⭐ |
| MySQL | 常见 Web 应用、简单统计 | ⭐⭐⭐⭐ |
| SQLite | 本地开发、AI 记忆、轻量数据 | ⭐⭐⭐⭐ |
8.3 部署检查清单
- 准备数据库,创建只读账号
- 安装 Node.js 和 MCP Server 包
- 在 Hermes 配置中添加 MCP server 条目
- 设置
allowed_tools白名单 - 测试基础查询:"列出所有表"
- 测试自然语言查询:"某个字段的平均值"
- (可选)编写 Skill 封装常用报表
- (可选)配置定时任务
8.4 常见问题 FAQ
Q:AI 生成的 SQL 错误怎么办?
A:可以手动校正,或者优化表结构(添加注释、外键约束)帮助 AI 理解。也可以让 AI 先输出 SQL 供你确认再执行。
Q:查询结果太大,导致 AI 上下文超限?
A:限制 SQL 的 LIMIT,或者在 MCP Server 端设置最大返回行数(通常默认 100)。
Q:可以支持其他数据库(如 Oracle、MongoDB)吗?
A:MCP 协议是开放的,社区已有 Oracle、MongoDB 等适配器,配置方式类似。
Q:能否让 AI 同时查询多个数据库?
A:可以,Hermes 可以配置多个 MCP Server,AI 会根据问题选择合适的数据库,甚至可以跨库 JOIN(需要 AI 自行合并结果,不建议大数据量)。
8.5 最终总结图
数据库 MCP
自然语言查询
支持的数据库
PostgreSQL
MySQL
SQLite
核心功能
自然语言 → SQL
自动生成报表
定时推送
安全机制
只读账号
工具白名单
查询超时/行数限制
扩展应用
AI 记忆存储
业务数据问答
自动化监控告警
8.6 一句话总结
数据库 MCP 让 AI 成为你的数据分析师------你只需用中文提问,剩下的 SQL 编写、执行、解释全由 AI 自动完成,真正做到零代码、零门槛。
下一步:动手搭建一个测试数据库,配置 MCP Server,然后试着问一句"帮我按月份统计销售额的变化趋势"。你会发现,数据分析从未如此简单。
附录:常用 MCP 数据库工具参考
| MCP Server 包名 | 数据库 | 安装命令 |
|---|---|---|
@modelcontextprotocol/server-postgres |
PostgreSQL | npx -y @modelcontextprotocol/server-postgres |
@modelcontextprotocol/server-mysql |
MySQL | npm install -g @modelcontextprotocol/server-mysql |
@modelcontextprotocol/server-sqlite |
SQLite | npx -y @modelcontextprotocol/server-sqlite |
版权声明:本文为原创技术博客,采用 CC BY-NC-SA 4.0 许可。欢迎转载,请保留出处。如有数据库 MCP 接入问题,欢迎评论区交流。