[特殊字符] 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操作函數。整個項目架構如下:

  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 = 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服務的方式有多種:

  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.pswp.cn/bicheng/77158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77158.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dify部署過程中的錯誤和解決方案匯總

本文僅限于記錄Dify部署及使用過程中的BUG和解決方案 1. Dify配置SearXNG時報錯&#xff1a; 報錯內容&#xff1a; PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message":"Error 4…

C#中async await異步關鍵字用法和異步的底層原理

目錄 C#異步編程一、異步編程基礎二、異步方法的工作原理三、代碼示例四、編譯后的底層實現五、總結 C#異步編程 一、異步編程基礎 異步編程是啥玩意兒 就是讓程序在干等著某些耗時操作&#xff08;比如等網絡響應、讀寫文件啥的&#xff09;的時候&#xff0c;能把線程騰出來…

安全教育知識競賽答題小程序怎么做

以下是制作安全教育知識競賽答題小程序的一般步驟&#xff1a; 一、準備階段 注冊小程序賬號&#xff1a;前往微信公眾平臺&#xff0c;注冊一個小程序賬號&#xff0c;主體類型可根據實際情況選擇個人或企業等&#xff0c;注冊成功后登錄獲取appid。 下載安裝開發工具&#x…

記錄待辦事項的便簽軟件有沒有推薦的?

在快節奏的現代生活中&#xff0c;我們每天都要處理大量的工作任務和生活瑣事&#xff0c;稍有不慎就可能遺漏重要事項。你是否經常遇到這樣的情況&#xff1a;明明記得有件事要做&#xff0c;卻怎么也想不起來是什么&#xff1b;或者手頭同時有好幾項任務&#xff0c;卻不知道…

實驗四 中斷實驗

一、實驗目的 掌握中斷服務程序的編寫。 二、實驗電路 三、實驗內容 1&#xff0e;實驗用PC機內部的中斷控制器8259A&#xff0c;中斷源用TPC-ZK實驗箱上的單脈沖電路&#xff0c;將單脈沖電路的輸出接中斷請求信號IRQ&#xff0c;每按一次單脈沖按鍵產生一次…

React 項目src文件結構

SCSS 組件庫 SCSS為預處理器 支持除原生CSS外的其他語句 別名路徑 在項目下的第一級目錄就加入craco.config.js文件并且修改packpage.js 中的部分 // 擴展webpage的配置const path require(path)module.exports {// exports配置webpack:{// 配置別名alias:{:path.resolve(__d…

Cursor入門教程-JetBrains過度向

Cursor使用筆記 **前置&#xff1a;**之前博主使用的是JetBrains的IDE&#xff0c;VSCode使用比較少&#xff0c;所以會盡量朝著JetBrains的使用習慣及樣式去調整。 一、設置語言為中文 如果剛上手Cursor&#xff0c;那么肯定對Cursor中的眾多選項配置項不熟悉&#xff0c;這…

Linux上位機開發實踐(SoC和MCU的差異)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 soc一般是指跑linux的芯片&#xff0c;而mcu默認是跑rtos的芯片&#xff0c;兩者在基本原理方面其實差異不大。只不過&#xff0c;前者由于性能的原…

離線導出和安裝Python庫

詳細介紹&#xff1a;離線導出和安裝Python庫 常用命令&#xff1a; 生成requirement.txt文件 pip freeze > requirement.txt離線批量下載庫 pip download -d packages -r requirement.txt離線批量安裝庫 pip install --no-index --find-links./ -r requirement.txt

基于Vue Node.js的電影售票網站的設計與實現(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 互聯網技術的成熟和普及&#xff0c;勢必會給人們的生活方式帶來不同程度的改變。越來越多的經營模式中都少不了線上運營&#xff0c;互聯網正強力推動著社會和經濟發展。國人對民族文化的自信和不同文化的包容&#xff0c;再加上電影行業的發展&#xff0c;如此繁榮吸引…

利用 Python 和 AI 技術創作獨特的圖像藝術作品

1. 項目目標 生成藝術作品&#xff1a;利用 AI 模型&#xff08;如 Stable Diffusion&#xff09;生成具有藝術風格的圖像。自定義風格&#xff1a;通過文本提示&#xff08;prompt&#xff09;控制圖像的藝術風格&#xff08;如賽博朋克、印象派、超現實主義等&#xff09;。…

XR技術賦能藝術展演|我的宇宙推動東方美學體驗化

本次廣州展覽現場引入我的宇宙XR體驗模塊&#xff0c;通過空間計算與動作捕捉技術&#xff0c;讓觀眾在潮玩藝術氛圍中體驗虛擬互動&#xff0c;打造“看得懂也玩得動”的展演新場景。 作為科技與文化融合的推動者&#xff0c;我的宇宙正在以“體驗科技”為媒介&#xff0c;為潮…

接口的集成測試步驟

一、集成測試是什么 ?接口的集成測試?是指在軟件開發過程中&#xff0c;將各個模塊或組件按照設計要求組合在一起&#xff0c;并測試它們之間的接口是否能夠正確交互和協同工作的過程。集成測試是軟件開發中的一個重要階段&#xff0c;通常在單元測試之后進行&#xff0c;目的…

上門服務 APP 30 億營收商業模式在烏干達的技術賦能與實踐

不久前&#xff0c;非洲烏干達出現黑人女技師提供上門足療服務的消息引發關注。據了解&#xff0c;當地一次40分鐘的上門按摩服務僅需約40元人民幣&#xff0c;價格僅為國內同類服務的十分之一。這一現象折射出全球健康服務行業正在經歷的數字化轉型浪潮。 國內領先的上門服務平…

go語言學習筆記:gin + gorm + mysql 用戶增刪改查案例入門

大家好&#xff0c;我是此林。 Golang 語言現在已經成為了編程的趨勢&#xff0c;畢竟是大廠背書嘛&#xff0c;Google 研發的。 目前很多云原生項目都是基于 go 來編寫的&#xff0c;比如&#xff1a; Kubernetes (K8s)? 容器編排系統&#xff0c; Docker? 容器化技術&…

探索亮數據Web Unlocker API:讓谷歌學術網頁科研數據 “觸手可及”

本文目錄 一、引言二、Web Unlocker API 功能亮點三、Web Unlocker API 實戰1.配置網頁解鎖器2.定位相關數據3.編寫代碼 四、Web Scraper API技術亮點 五、SERP API技術亮點 六、總結 一、引言 網頁數據宛如一座蘊藏著無限價值的寶庫&#xff0c;無論是企業洞察市場動態、制定…

SpringBoot整合POI實現Excel文件的導出與導入

使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI實現Excel文件的導出與導入》 《SpringMVC實現文件的上傳與下載》 《C#使用NPOI導出Excel文件》 《NPOI使用手冊》 1、Apache POI 的介紹 Apache POI 是一個基于 Java 的開源庫,專為讀寫 Microsoft Office 格…

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐 發布日期: 2025-04-16 引言 在財務管理應用領域&#xff0c;技術實力固然重要&#xff0c;但最終決定用戶留存的往往是日常使用體驗。本文作為LedgerX技術博客的第二篇&#xff0c;將深入探討我們如何通過精心的交互…

如何用AI輔助軟件產品原型設計及工具推薦

以下是針對軟件產品原型設計的 AI輔助工具推薦&#xff0c;涵蓋國內外主流工具&#xff0c;結合功能特點、優劣勢及適用場景分析&#xff0c;并標注是否為國內軟件及付費情況&#xff1a; 一、國內工具推薦 1. 墨刀AI&#xff08;MockingBot AI&#xff09; 特點&#xff1a;…

MySQL的MVCC機制詳解

1. 什么是MVCC&#xff1f; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;是數據庫系統中用于實現并發控制的一種技術。它通過保存數據在某個時間點的快照來實現&#xff0c;使得在同一個數據行上可以同時存在多個版本&#xff0…