【Hermes:MCP 与工具实战】29、数据库 MCP 实战:MySQL/PostgreSQL/SQLite 自然语言查询

数据库 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 意外执行 DROPDELETE 等命令。


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 内部流程

  1. 调用 list_tables 了解有哪些表
  2. 调用 describe_table sales 了解字段含义
  3. 生成 SQL:SELECT SUM(amount) FROM sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-01-31';
  4. 通过 query 工具执行
  5. 将数字结果转换为自然语言:"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 会:

  1. 查看 products 表结构(price, stock)
  2. 计算价值:price * stock
  3. 生成 SQL:SELECT name, price*stock AS value FROM products ORDER BY value DESC LIMIT 1;
  4. 返回:"库存价值最高的产品是 MacBook Air,价值 269970 元。"

4.5 SQLite 的优势场景

  • AI 本地缓存:存储对话历史、用户偏好,不依赖网络
  • 轻量数据分析:CSV 导入 SQLite,让 AI 做复杂查询
  • 原型验证:无需安装数据库服务器

5. 自然语言查询、统计、生成报表

5.1 从简单查询到复杂统计

数据库 MCP 不只是执行单条 SQL。结合 AI 的推理能力,可以实现:

1. 多步查询分解

用户问:"去年销量最高的产品今年还在卖吗?" AI 可能拆成两步:

  • 查询去年销量最高的产品名
  • 查询该产品在当前年份是否有销售记录

2. 自动时间范围处理

用户说"上个季度",AI 会根据当前日期自动计算出上季度的起止日期。

3. 跨表关联

如果数据库有 orderscustomers 表,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 模型通常不会主动破坏,但可能误解用户意图)
  • 意外执行 DELETEDROP(例如用户说"删除去年的数据",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 接入问题,欢迎评论区交流。

相关推荐
ㄟ留恋さ寂寞1 小时前
怎样修改提示“表已空”的空状态界面_Empty State插画替换
jvm·数据库·python
m0_591364731 小时前
SQL提升开发效率_使用CTE重构嵌套子查询逻辑
jvm·数据库·python
Elnaij1 小时前
MySQL数据库入门到进阶!!(1)——在云服务器中安装MySQL(centos)
数据库·mysql
2401_831419442 小时前
JavaScript 中实现基于分组的前端产品筛选功能
jvm·数据库·python
yexuhgu2 小时前
CSS实现盒子阴影扩散效果_调整box-shadow的模糊半径
jvm·数据库·python
Jetev2 小时前
CSS如何实现优雅的间距_使用CSS Grid控制盒模型间隙
jvm·数据库·python
qq_414256572 小时前
HTML函数开发需要独立显卡吗_HTML函数与显卡关系详解【说明】
jvm·数据库·python
CN.LG2 小时前
Mysql5.1.41+SQLyog的详细安装教程
数据库·mysql·sqlyog
qq_392690662 小时前
CSS如何利用-disabled伪类禁用交互元素_通过灰度效果提升界面逻辑清晰度
jvm·数据库·python