[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手

news2025/4/20 4:39:55

💡 简介:本文详细介绍如何利用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操作函数。整个项目架构如下:

  1. 配置管理:支持命令行参数、环境变量和默认配置
  2. 连接管理:处理数据库连接、重试和错误报告
  3. 工具函数:封装MySQL操作为易用的API
  4. 错误处理:提供详细的错误信息和原因分析

🛠️ 开发环境搭建

首先,我们需要准备开发环境:

  1. 安装Python 3.12或更高版本
  2. 安装所需依赖:
    • 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 = 0
    last_error = None
    max_retries = db_config.get("connect_retry_count", 3)
    
    while retry_count < max_retries:
        try:
            # 创建连接...
            return conn
        except Error as e:
            last_error = e
            retry_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服务的方式有多种:

  1. 直接运行脚本

    python mysql-mcp.py --host localhost --port 3306 --user root --password your_password --database your_database
    
  2. 通过环境变量

    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
    
  3. 通过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工具还有许多可扩展之处:

  1. 事务支持:添加事务控制函数,如begin_transactioncommitrollback
  2. 批量操作:支持批量插入、更新和删除
  3. 查询构建器:提供SQL查询构建助手,简化复杂查询的构造
  4. 读写分离:支持主从数据库配置
  5. 连接池:实现连接池管理,提高性能
  6. 安全增强:添加输入验证和SQL注入防护

📝 总结

通过MySQL MCP工具,我们成功将复杂的数据库操作封装为简单直观的API,使AI助手能够直接执行数据库任务。该工具的主要优势包括:

  1. 简单易用:清晰的API设计,易于理解和使用
  2. 错误处理:详细的错误信息和原因分析
  3. 灵活配置:支持多种配置方式
  4. 安全可靠:参数化查询防止SQL注入
  5. 完整功能:涵盖常见的数据库操作

MySQL MCP工具为开发者提供了一种全新的数据库交互方式,特别适合与AI工具集成,大大简化了数据库操作流程,提高了开发效率。

希望本文能帮助你了解MCP框架的强大功能,并启发你开发更多创新的工具应用。

📚 参考资料

  1. MySQL Connector/Python 文档
  2. !!!项目源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element-ui自定义主题

此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview&#xff08;element的主题&#xff09;报错503&#xff0c; 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中&#xff0c;在项目中改变scss变量的方…

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django&#xff0c;在Windows下&#xff0c;可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django&#xff0c;,他们的关系如下 django是WEB应用…

MySQL-多版本并发控制MVCC

文章目录 一、多版本并发控制MVCC二、undo log&#xff08;回滚日志&#xff09;二、已提交读三、可重复读总结 一、多版本并发控制MVCC MVCC是多版本并发控制&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;是MySQL中基于乐观锁理论实现隔离级别的方…

目标检测与分割:深度学习在视觉中的应用

&#x1f50d; PART 1&#xff1a;目标检测&#xff08;Object Detection&#xff09; 1️⃣ 什么是目标检测&#xff1f; 目标检测是计算机视觉中的一个任务&#xff0c;目标是让模型“在图像中找到物体”&#xff0c;并且判断&#xff1a; 它是什么类别&#xff08;classif…

杰弗里·辛顿:深度学习教父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 杰弗里辛顿&#xff1a;当坚持遇见突破&#xff0c;AI迎来新纪元 一、人物简介 杰弗…

STM32蓝牙连接Android实现云端数据通信(电机控制-开源)

引言 基于 STM32F103C8T6 最小系统板完成电机控制。这个小项目采用 HAL 库方法实现&#xff0c;通过 CubeMAX 配置相关引脚&#xff0c;步进电机使用 28BYJ-48 &#xff08;四相五线式步进电机&#xff09;&#xff0c;程序通过蓝牙连接手机 APP 端进行数据收发&#xff0c; OL…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 下载安装Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV&#xff1a;https://opencv.org/releases/ 下载安装CMake&#xff1a;Downl…

TCP 如何在网络 “江湖” 立威建交?

一、特点&#xff1a; &#xff08;一&#xff09;面向连接 在进行数据传输之前&#xff0c;TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话&#xff0c;双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成&#xff0c;确保通信双方都…

【小白训练日记——2025/4/15】

变化检测常用的性能指标 变化检测&#xff08;Change Detection&#xff09;的性能评估依赖于多种指标&#xff0c;每种指标从不同角度衡量模型的准确性。以下是常用的性能指标及其含义&#xff1a; 1. 混淆矩阵&#xff08;Confusion Matrix&#xff09; 定义&#xff1a;统…

数据结构——二叉树(中)

接上一篇&#xff0c;上一篇主要讲解了关于二叉树的基本知识&#xff0c;也是为了接下来讲解关于堆结构和链式二叉树结构打基础&#xff0c;其实无论是堆结构还是链式二叉树结构&#xff0c;都是二叉树的存储结构&#xff0c;那么今天这一篇主要讲解关于堆结构的实现与应用 堆…

02-MySQL 面试题-mk

文章目录 1.mysql 有哪些存储引擎、区别是什么?1.如何定位慢查询?2.SQL语句执行很慢,如何分析?3.索引概念以及索引底层的数据结构4.什么是聚簇索引什么是非聚簇索引?5.知道什么叫覆盖索引嘛 ?6.索引创建原则有哪些?7.什么情况下索引会失效 ?8.谈一谈你对sql的优化的经验…

#include<bits/stdc++.h>

#include<bits/stdc.h> 是 C 中一个特殊的头文件&#xff0c;其作用如下&#xff1a; 核心作用 ​​包含所有标准库头文件​​ 该头文件会自动引入 C 标准库中的几乎全部头文件&#xff08;如 <iostream>、<vector>、<algorithm> 等&#xff09;&…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…

STM32H503CB升级BootLoader

首先&#xff0c;使用SWD接口&#xff0c;ST-LINK连接电脑和板子。 安装SetupSTM32CubeProgrammer_win64 版本2.19。 以下是接线和软件操作截图。

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成三.启动安装1.上下键直接选择安装2.回车安装3.设置分区(默认即可)和 roo…

cursor如何回退一键回退多个文件的修改

当我们使用 Cursor 写代码时&#xff0c;起初可能操作得很顺利&#xff0c;但某次更改或许会让代码变得面目全非。这时候如果没有使用 Git 该怎么办呢&#xff1f;别担心&#xff0c;Cursor 已经为我们考虑到了。 具体的操作如下&#xff1a; 当我们要取消某次操作时&#xf…

基于RV1126开发板的口罩识别算法开发

1. 口罩识别简介 口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法&#xff0c;能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸&#xff0c;然后输入到口罩识别分类算法进行识别。 本人脸检测算法在数据集表现如下所示&am…