[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手
💡 简介:本文详细介绍如何利用MCP(Model-Control-Panel)框架开发MySQL数据库操作工具,使AI助手能够直接执行数据库操作。
📚 目录
- 引言
- MCP框架简介
- 项目架构设计
- 开发环境搭建
- 核心代码实现
- 错误处理策略
- 运行和部署
- 使用示例
- 项目扩展与优化
- 总结
- 参考资料 和 项目源码
🌟 引言
在现代软件开发中,数据库操作是不可或缺的一部分。随着人工智能技术的发展,将AI与数据库操作工具结合起来成为一种新趋势。本文将介绍如何利用MCP(Model-Control-Panel)框架开发一个MySQL数据库操作工具,使AI助手能够直接执行数据库操作。
🔍 MCP框架简介
MCP(Model-Control-Panel)是一个创新的工具框架,它允许我们将工具函数暴露为API,使模型(如AI助手)能够直接调用这些函数。通过MCP,我们可以将繁琐的数据库操作封装成简单的函数调用,大大提高开发效率。
🏗️ 项目架构设计
MySQL MCP工具的核心是一个Python脚本,它使用FastMCP服务器暴露MySQL操作函数。整个项目架构如下:
- 配置管理:支持命令行参数、环境变量和默认配置
- 连接管理:处理数据库连接、重试和错误报告
- 工具函数:封装MySQL操作为易用的API
- 错误处理:提供详细的错误信息和原因分析
🛠️ 开发环境搭建
首先,我们需要准备开发环境:
- 安装Python 3.12或更高版本
- 安装所需依赖:
- mcp[cli] >= 1.5.0
- mysql-connector-python >= 9.2.0
项目的pyproject.toml文件定义了这些依赖:
[project]
name = "mysql-mcp"
version = "0.1.0"
description = "MySQL MCP 工具"
readme = "README.md"
requires-python = ">=3.12"
dependencies = ["mcp[cli]>=1.5.0","mysql-connector-python>=9.2.0",
]
💻 核心代码实现
初始化MCP服务器
首先,我们导入必要的模块并初始化FastMCP服务器:
from typing import Any, List, Dict, Optional
import os
import argparse
import mysql.connector
from mysql.connector import Error
from mcp.server.fastmcp import FastMCP# 初始化 FastMCP server
mcp = FastMCP("mysql")
配置管理
为了使工具更加灵活,我们实现了多层次的配置系统:
# 数据库连接配置默认值
DEFAULT_DB_CONFIG = {"host": os.getenv("MYSQL_HOST", "localhost"),"port": int(os.getenv("MYSQL_PORT", "3306")),"user": os.getenv("MYSQL_USER", "root"),"password": os.getenv("MYSQL_PASSWORD", "root"),"database": os.getenv("MYSQL_DATABASE", ""),"connection_timeout": int(os.getenv("MYSQL_CONNECTION_TIMEOUT", "10")),"connect_retry_count": int(os.getenv("MYSQL_CONNECT_RETRY_COUNT", "3"))
}
命令行参数解析:
def parse_args():parser = argparse.ArgumentParser(description='MySQL MCP服务')parser.add_argument('--host', type=str, help='数据库主机地址')parser.add_argument('--port', type=int, help='数据库端口')parser.add_argument('--user', type=str, help='数据库用户名')parser.add_argument('--password', type=str, help='数据库密码')parser.add_argument('--database', type=str, help='数据库名称')parser.add_argument('--connection-timeout', type=int, help='连接超时时间(秒)')parser.add_argument('--connect-retry-count', type=int, help='连接重试次数')return parser.parse_args()
数据库连接管理
数据库连接是工具的核心部分,我们实现了连接重试和详细的错误报告:
def get_connection(db_config=None):"""获取数据库连接Args:db_config: 数据库连接配置参数,如果为None则使用默认配置Returns:数据库连接对象"""# 配置处理逻辑...retry_count = 0last_error = Nonemax_retries = db_config.get("connect_retry_count", 3)while retry_count < max_retries:try:# 创建连接...return connexcept Error as e:last_error = eretry_count += 1# 重试逻辑...# 详细错误报告error_message = f"数据库连接错误(重试 {retry_count} 次后): {last_error}"if "Can't connect to MySQL server" in str(last_error):error_message += f"\n无法连接到MySQL服务器,请检查主机 {db_config['host']} 和端口 {db_config['port']} 是否正确"# 更多详细信息...raise Exception(error_message)
工具函数实现
下面是几个关键工具函数的实现:
1️⃣ 执行SQL查询
@mcp.tool()
async def execute_query(query: str, params: Optional[List[Any]] = None, db_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:"""执行SQL查询语句,返回查询结果"""try:conn = get_connection(db_config)cursor = conn.cursor(dictionary=True)cursor.execute(query, params)# 判断查询类型并返回适当的结果query_upper = query.strip().upper()if query_upper.startswith("SELECT") or query_upper.startswith("SHOW") or query_upper.startswith("DESCRIBE"):results = cursor.fetchall()return {"success": True,"rows": results,"row_count": len(results)}else:# 非查询操作(如INSERT, UPDATE, DELETE)conn.commit()return {"success": True,"affected_rows": cursor.rowcount,"last_insert_id": cursor.lastrowid}except Error as e:# 错误处理和详细分析error_message = f"执行查询失败: {str(e)}"if "Unknown column" in str(e):error_message += "\n原因:查询中包含未知的列名"# 更多错误分析...return {"error": error_message, "query": query}finally:# 确保资源释放if 'conn' in locals() and conn.is_connected():cursor.close()conn.close()
2️⃣ 列出表
@mcp.tool()
async def list_tables(database_name: Optional[str] = None, db_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:"""列出指定数据库中的所有表"""try:conn = get_connection(db_config)cursor = conn.cursor()# 执行适当的查询if database_name:cursor.execute(f"SHOW TABLES FROM {database_name}")else:cursor.execute("SHOW TABLES")tables = [table[0] for table in cursor.fetchall()]return {"success": True,"database": database_name or conn.database,"tables": tables,"count": len(tables)}except Error as e:# 错误处理...
3️⃣ 获取表结构
@mcp.tool()
async def describe_table(table_name: str, db_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:"""获取表结构"""try:conn = get_connection(db_config)cursor = conn.cursor(dictionary=True)cursor.execute(f"DESCRIBE {table_name}")columns = cursor.fetchall()return {"success": True,"table": table_name,"columns": columns}except Error as e:# 错误处理...
4️⃣ 数据操作函数
此外,我们还实现了一系列数据操作函数:
create_table: 创建新表insert_data: 插入数据update_data: 更新数据delete_data: 删除数据use_database: 切换数据库
⚠️ 错误处理策略
MySQL MCP工具的一大特色是提供了详细的错误分析和报告。对于每种常见的数据库错误,我们都提供了简洁明了的解释和可能的解决方案:
# 示例:插入数据时的错误处理
error_message = f"插入数据失败: {str(e)}"
if "doesn't exist" in str(e):error_message += f"\n原因:表 {table_name} 不存在"
elif "Unknown column" in str(e):error_message += "\n原因:插入数据中包含表中不存在的列"
elif "cannot be null" in str(e):error_message += "\n原因:某个NOT NULL字段被设置为NULL值"
elif "Duplicate entry" in str(e):error_message += "\n原因:插入的数据违反了唯一键约束"
elif "Data too long" in str(e):error_message += "\n原因:插入的数据超出了字段的长度限制"
🚀 运行和部署
最后,我们设置了入口点并启动MCP服务器:
if __name__ == "__main__":# 从命令行参数获取配置GLOBAL_DB_CONFIG = get_config_from_args()# 启动MCP服务器mcp.run(transport='stdio')
配置和启动MCP服务的方式有多种:
-
直接运行脚本:
python mysql-mcp.py --host localhost --port 3306 --user root --password your_password --database your_database -
通过环境变量:
export MYSQL_HOST=localhost export MYSQL_PORT=3306 export MYSQL_USER=root export MYSQL_PASSWORD=your_password export MYSQL_DATABASE=your_database python mysql-mcp.py -
通过Cursor IDE配置:
在~/.cursor/mcp.json中添加配置:{"mcpServers": {"mysql-mcp": {"command": "/path/to/uv","args": ["--directory","/path/to/mysql-mcp","run","mysql-mcp.py","--host", "xxx.xxx.xxx.xxx","--port", "3306","--user", "root","--password", "********","--database", "your_database"]}} }
📊 使用示例
配置完成后,在Cursor IDE中,AI助手可以直接调用MySQL MCP工具:
# 查询所有数据库# 列出当前数据库的所有表# 查询用户表中年龄大于18的用户# 创建新表# 插入数据# 更新数据# 删除数据
🔧 项目扩展与优化
MySQL MCP工具还有许多可扩展之处:
- 事务支持:添加事务控制函数,如
begin_transaction、commit和rollback - 批量操作:支持批量插入、更新和删除
- 查询构建器:提供SQL查询构建助手,简化复杂查询的构造
- 读写分离:支持主从数据库配置
- 连接池:实现连接池管理,提高性能
- 安全增强:添加输入验证和SQL注入防护
📝 总结
通过MySQL MCP工具,我们成功将复杂的数据库操作封装为简单直观的API,使AI助手能够直接执行数据库任务。该工具的主要优势包括:
- 简单易用:清晰的API设计,易于理解和使用
- 错误处理:详细的错误信息和原因分析
- 灵活配置:支持多种配置方式
- 安全可靠:参数化查询防止SQL注入
- 完整功能:涵盖常见的数据库操作
MySQL MCP工具为开发者提供了一种全新的数据库交互方式,特别适合与AI工具集成,大大简化了数据库操作流程,提高了开发效率。
希望本文能帮助你了解MCP框架的强大功能,并启发你开发更多创新的工具应用。
📚 参考资料
- MySQL Connector/Python 文档
- !!!项目源码
相关文章:
[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手
💡 简介:本文详细介绍如何利用MCP(Model-Control-Panel)框架开发MySQL数据库操作工具,使AI助手能够直接执行数据库操作。 📚 目录 引言MCP框架简介项目架构设计开发环境搭建核心代码实现错误处理策略运行和…...
element-ui自定义主题
此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview(element的主题)报错503, 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中,在项目中改变scss变量的方…...
windows下使用nginx + waitress 部署django
架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…...
MySQL-多版本并发控制MVCC
文章目录 一、多版本并发控制MVCC二、undo log(回滚日志)二、已提交读三、可重复读总结 一、多版本并发控制MVCC MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方…...
Sherpa简介
Sherpa 是一个由 K2-FSA 团队 开发的 开源语音处理框架,旨在解决传统语音识别工具(如 Kaldi)在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎,提供了从语音识别、合成到说话人识别的一站式解决方…...
4.15redis点评项目下
--->接redis点评项目上 Redis优化秒杀方案 下单流程为:用户请求nginx--->访问tomcat--->查询优惠券--->判断秒杀库存是否足够--->查询订单--->校验是否是一人一单--->扣减库存--->创建订单 以上流程如果要串行执行耗时会很多,…...
目标检测与分割:深度学习在视觉中的应用
🔍 PART 1:目标检测(Object Detection) 1️⃣ 什么是目标检测? 目标检测是计算机视觉中的一个任务,目标是让模型“在图像中找到物体”,并且判断: 它是什么类别(classif…...
SpringBoot 与 Vue3 实现前后端互联全解析
在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…...
HEIF、HEIC、JPG 和 PNG是什么?
1. HEIF (High Efficiency Image Format) 定义:HEIF 是一种用于存储单张图像和图像序列(如连拍照片)的图像文件格式。优势:相比传统的图像格式,HEIF 提供了更高的压缩效率和更好的图像质量。压缩算法:HEI…...
第一层、第二层与第三层隧道协议
(本文由deepseek生成,特此声明) 隧道协议是网络通信中用于在不同网络间安全传输数据的关键技术,其工作层次决定了封装方式、功能特性及应用场景。本文将详细介绍物理层(第一层)、数据链路层(第…...
部署qwen2.5-VL-7B
简单串行执行 from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info import torch, time, threadingdef llm(model_path,promptNone,imageNone,videoNone,imagesNone,videosNone,max_new_tokens2048,t…...
记录jdk8->jdk17 遇到的坑和解决方案
最近项目在升级jdk8->jdk17 springboot2->springboot3 顺序先升级业务服务,后升级组件服务。跟随迭代开发一起验证功能。 1. 使用parent pom 版本管理 spring相关组件的版本。 组件依赖低版本parent不变。 业务服务依赖高版本parent。 2. 修改maven jdk…...
vue3 uniapp vite 配置之定义指令
动态引入指令 // src/directives/index.js import trim from ./trim;const directives {trim, };export default {install(app) {console.log([✔] 自定义指令插件 install 触发了!);Object.entries(directives).forEach(([key, directive]) > {app.directive(…...
杰弗里·辛顿:深度学习教父
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 杰弗里辛顿:当坚持遇见突破,AI迎来新纪元 一、人物简介 杰弗…...
STM32蓝牙连接Android实现云端数据通信(电机控制-开源)
引言 基于 STM32F103C8T6 最小系统板完成电机控制。这个小项目采用 HAL 库方法实现,通过 CubeMAX 配置相关引脚,步进电机使用 28BYJ-48 (四相五线式步进电机),程序通过蓝牙连接手机 APP 端进行数据收发, OL…...
第一个Qt开发的OpenCV程序
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 下载安装Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV:https://opencv.org/releases/ 下载安装CMake:Downl…...
如何编写爬取网络上的视频文件
网络爬虫程序,可以爬取某些网站上的视频,音频,图片或其它文件,然后保存到本地电脑上; 有时在工作中非常有用,那在技术上如何进行爬取文件和保存到本地呢?下面以python语言为例,讲解p…...
TCP 如何在网络 “江湖” 立威建交?
一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…...
【小白训练日记——2025/4/15】
变化检测常用的性能指标 变化检测(Change Detection)的性能评估依赖于多种指标,每种指标从不同角度衡量模型的准确性。以下是常用的性能指标及其含义: 1. 混淆矩阵(Confusion Matrix) 定义:统…...
交叉熵在机器学习中的应用解析
文章目录 核心概念香农信息量(自信息)熵(Entropy)KL散度(Kullback-Leibler Divergence)交叉熵 在机器学习中的应用作为损失函数对于二分类(Binary Classification):对于多…...
ARM Cortex汇编指令
在ARM架构的MCU开发中,汇编指令集是底层编程的核心。以下是针对Cortex-M系列(如M0/M3/M4/M7/M85)的指令集体系、分类及查询方法的详细说明: 一、指令集体系与核心差异 1. 架构版本与指令集特性 处理器架构指令集特点典型应用场…...
数据结构——二叉树(中)
接上一篇,上一篇主要讲解了关于二叉树的基本知识,也是为了接下来讲解关于堆结构和链式二叉树结构打基础,其实无论是堆结构还是链式二叉树结构,都是二叉树的存储结构,那么今天这一篇主要讲解关于堆结构的实现与应用 堆…...
InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?
概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争&…...
UDP目标IP不存在时的发送行为分析
当网络程序使用UDP协议发送数据时,如果目标IP不存在,发送程序的行为取决于网络环境和操作系统的处理机制。以下是详细分析: 1. UDP的无连接特性 UDP是无连接的传输协议,发送方不会预先建立连接,也不会收到对方是否存在…...
WHAT - 动态导入模块遇到版本更新解决方案
文章目录 一、动态导入模块二、常见原因与解决方案1. 模块 URL 错误2. 开发人员发版用户停留在旧页面问题背景解决方案思路1. 监听错误,提示用户刷新2. 使用缓存控制策略:强制刷新3. 动态模块加载失败时兜底4. 使用 import.meta.glob() 或 webpack 的 __…...
02-MySQL 面试题-mk
文章目录 1.mysql 有哪些存储引擎、区别是什么?1.如何定位慢查询?2.SQL语句执行很慢,如何分析?3.索引概念以及索引底层的数据结构4.什么是聚簇索引什么是非聚簇索引?5.知道什么叫覆盖索引嘛 ?6.索引创建原则有哪些?7.什么情况下索引会失效 ?8.谈一谈你对sql的优化的经验…...
#include<bits/stdc++.h>
#include<bits/stdc.h> 是 C 中一个特殊的头文件,其作用如下: 核心作用 包含所有标准库头文件 该头文件会自动引入 C 标准库中的几乎全部头文件(如 <iostream>、<vector>、<algorithm> 等)&…...
PostgreSQL:逻辑复制与物理复制
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...
在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414
在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展,企业对GPU加速计算的需求愈加迫切。在此过程中,如何高效地配置宿主机与容器化环境,特别是利用NVIDIA GPU和相关工具&…...
iphone各个机型尺寸
以下是苹果(Apple)历代 iPhone 机型 的屏幕尺寸、分辨率及其他关键参数汇总(截至 2023年10月,数据基于官方发布信息): 一、标准屏 iPhone(非Pro系列) 机型屏幕尺寸(英寸…...
