1. 项目概述
MySQL MCP(Model Context Protocol for MySQL)是一个基于MCP协议的服务器组件,它充当了大语言模型(LLM)与MySQL数据库之间的桥梁。这个解决方案的核心价值在于:让开发者能够通过自然语言与数据库交互,而无需手动编写SQL语句。
在实际开发中,我经常遇到这样的场景:产品经理或业务人员需要查询数据库,但他们不熟悉SQL语法。传统解决方案要么需要开发专门的查询接口,要么需要培训他们学习SQL。而MySQL MCP通过将自然语言自动转换为SQL语句,完美解决了这个问题。
2. 环境准备与安装
2.1 安装MySQL MCP Server
MySQL MCP Server是整套方案的核心组件,它负责处理自然语言到SQL的转换。安装方式有两种:
- 局部安装(推荐用于开发环境):
bash复制npm install mysql-mcp-server
- 全局安装(适合生产环境):
bash复制npm -g install mysql-mcp-server
注意:在Windows系统上执行全局安装后,可能需要手动将npm全局路径添加到系统环境变量中。
2.2 配置数据库连接
安装完成后,需要在配置文件中设置数据库连接参数。以下是一个完整的配置示例:
yaml复制server:
port: 8013
spring:
application:
name: ai-siliconflow-glm-mcp-sse-client
ai:
openai:
base-url: https://api.siliconflow.cn
api-key: 你的硅基流动key
chat:
options:
model: "zai-org/GLM-4.6"
temperature: 0.7
mcp:
client:
name: ai-siliconflow-glm-mcp-mysql-client
stdio:
connections:
mysql:
command: "npx.cmd" # Windows使用npx.cmd,Linux/Mac使用npx
args:
- "mysql-mcp-server"
env:
MYSQL_HOST: "localhost"
MYSQL_PORT: "3306"
MYSQL_USER: "root"
MYSQL_PASSWORD: "123456"
MYSQL_DATABASE: "jiazhong_2025_2"
关键配置说明:
temperature: 控制生成SQL的创造性,值越低结果越保守(推荐0.7)command: 不同操作系统需要调整- 数据库连接参数需要与实际环境一致
3. 核心代码实现
3.1 配置类详解
ChatClientConfig类负责初始化ChatClient并集成MCP功能:
java复制@Configuration
public class ChatClientConfig {
@Resource
private OpenAiChatModel openAiChatModel;
@Resource
private SyncMcpToolCallbackProvider syncMcpToolCallbackProvider;
@Bean("openAiChatClient")
public ChatClient openAiChatClient() {
return ChatClient.builder(openAiChatModel)
.defaultToolCallbacks(syncMcpToolCallbackProvider)
.build();
}
}
这个配置的关键点在于:
- 注入
OpenAiChatModel提供大模型能力 - 通过
SyncMcpToolCallbackProvider实现MCP协议支持 - 构建的
ChatClient将同时具备自然语言处理和SQL转换能力
3.2 控制器实现
MySQLController提供了RESTful接口,接收自然语言查询并返回结果:
java复制@RestController
@RequestMapping("/mysql")
public class MySQLController {
@Resource
private ChatClient openAiChatClient;
@GetMapping(value = "/query", produces = "text/html;charset=utf-8")
public Flux<String> query(@RequestParam("q") String question) {
return openAiChatClient.prompt("查询jiazhong_2025_2数据库")
.user(question)
.stream()
.content();
}
}
实际使用中,我发现几个优化点:
- 可以增加prompt工程优化,提高SQL生成准确率
- 对于复杂查询,建议分步骤引导用户输入
- 返回结果可以包装成标准JSON格式
3.3 启动类配置
标准Spring Boot启动类:
java复制@SpringBootApplication
public class AiApplication {
public static void main(String[] args) {
SpringApplication.run(AiApplication.class, args);
}
}
4. 高级功能与优化
4.1 多数据库支持
通过修改配置,可以支持连接多个数据库:
yaml复制env:
MYSQL_DATABASE: "db1,db2,db3"
然后在prompt中指定数据库:
java复制openAiChatClient.prompt("请查询db2数据库中的用户表")
4.2 查询缓存
为了提高性能,可以添加查询缓存机制:
java复制@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("sqlCache");
}
@Cacheable("sqlCache")
public Flux<String> query(String question) {
// 原有查询逻辑
}
4.3 安全性控制
建议实现以下安全措施:
- SQL注入检测
- 查询结果脱敏
- 访问权限控制
5. 常见问题排查
5.1 连接失败问题
症状:无法连接到MySQL服务器
解决方案:
- 检查
MYSQL_HOST和MYSQL_PORT是否正确 - 确认MySQL用户有远程连接权限
- 检查防火墙设置
5.2 SQL生成错误
症状:生成的SQL语法不正确
解决方案:
- 调整
temperature参数降低创造性 - 在prompt中提供更详细的表结构信息
- 添加示例SQL到prompt中
5.3 性能优化
症状:响应速度慢
优化建议:
- 增加连接池配置
- 对复杂查询添加超时控制
- 考虑使用异步处理
6. 实际应用案例
假设我们有一个电商数据库,包含以下表:
- users(用户信息)
- products(商品信息)
- orders(订单记录)
通过MySQL MCP,可以直接用自然语言查询:
code复制"查询最近一个月消费金额超过1000元的VIP用户列表,按消费金额降序排列"
系统会自动生成类似SQL:
sql复制SELECT u.* FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.vip = 1
AND o.order_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY u.id
HAVING SUM(o.amount) > 1000
ORDER BY SUM(o.amount) DESC
在实际项目中,这种功能可以显著降低非技术人员的数据库查询门槛,提高工作效率。