【大模型】基于MCP的mysql 服務構建及使用(python語言)

前言

? 在之前使用dify來編排AI智能體,有這樣的一個場景,希望智能體能自動讀取數據庫數據,獲得統計數據(問數),最終生成報告。

? 當時實現思路是,通過知識庫告訴大模型相關表的字段定義,然后讓大模型根據提示詞生成對應統計指標SQL語句,然后調用mysql工具去執行,返回結果。這其中,需要整理一堆表定義的知識庫,且最終效果也不好。

? MCP(Model Context Protocol,模型上下文協議 )協議出現后,大量MCP服務涌出,其中mysql 類的MCP服務,使用cline可以得出不錯的問數效果。但基本都是Typescript實現的,且安全性無法保證。在實際使用中,更愿意自己去維護一個本地MCP服務。該文檔即是探究使用python開發調試本地mysql MCP服務的方法。

功能分析

  • 執行查詢SQL功能

    由大模型生成相關問題查詢SQL語句,發送給MCP服務執行,并返回結果給大模型

  • 查詢指定表的模式

    要想讓大模型生成正確的SQL,需要告訴大模型指定表的結構模式

  • 查詢指定數據庫所有表

    想要獲取指定表名,需要先列出所有的表名

初始化項目環境

uv init mysql-mcp
cd mysql-mcp
# 創建mcp服務虛擬環境
uv venv
# 激活該環境
.venv\Scripts\activate

代碼實現

安裝依賴包

pip install mysql-connector-python
uv add "mcp[cli]"

代碼如下:

mysql-mcp.py

from mcp.server.fastmcp import FastMCP
from config import DB_CONFIG
import pymysql
import utils# 初始化mcp服務
mcp = FastMCP("mysql-mcp")@mcp.tool()
def list_tables():"""獲取數據庫所有表名"""try:mydb = pymysql.connect(**DB_CONFIG)mycursor = mydb.cursor()mycursor.execute("SHOW TABLES")tables = mycursor.fetchall()table_names = [table[0] for table in tables]return table_namesexcept pymysql.Error as err:print(f"MySQL Error: {err}")return {"error": str(err)}finally:if 'mycursor' in locals():mycursor.close()if 'mydb' in locals():mydb.close()@mcp.tool()
def describ_table(table_name:str):"""返回表的結構"""try:mydb = pymysql.connect(**DB_CONFIG)mycursor = mydb.cursor()mycursor.execute("SELECT column_name, data_type FROM information_schema.columns WHERE table_name = %s",table_name)table_desc = mycursor.fetchall()return table_descexcept pymysql.Error as err:print(f"MySQL Error: {err}")return {"error": str(err)}finally:if 'mycursor' in locals():mycursor.close()if 'mydb' in locals():mydb.close()@mcp.tool()
def execute_sql(sql:str):"""執行SQL語句,返回查詢結果"""try:mydb = pymysql.connect(**DB_CONFIG)mycursor = mydb.cursor()mycursor.execute(sql)# 獲取列名column_names = [desc[0] for desc in mycursor.description]if mycursor.rowcount == 0:mydb.commit()return {"message": "執行成功,無返回結果"}else:return utils.data_transformer(column_names,mycursor.fetchall())except pymysql.Error as err:print(f"MySQL Error: {err}")return {"error": str(err)}finally:if 'mycursor' in locals():mycursor.close()if 'mydb' in locals():mydb.close()if __name__ == "__main__":print("啟動mysql-mcp服務")mcp.run(transport="stdio")

config.py,配置數據庫連接

DB_CONFIG = {"host": "127.0.0.1","port": 3306,"user": "root","password": "XXXX@123456","database": "XXX",}

調試

調試bug

在寫完代碼后,可以使用如下命令去調試是否存在語法錯誤

python ./mysql-mcp.py

在這里插入圖片描述

可以看到mcp包未安裝

在這里插入圖片描述

mysql 包未安裝

在這里插入圖片描述

目錄名和mysql包名重復了,修改目錄名

經過多次安裝,還是提示不存在。在這個目錄層次下,使用conda 虛擬了一個python環境,python版本為3.10,在mysql目錄下又使用uv venv虛擬了一個環境,但該虛擬環境是用的conda環境下的python包,所以有點亂;

于是直接將uv venv虛擬環境刪掉,直接新建目錄mysqlmcp,然后復制如上的代碼。

執行

mcp dev ./mysql-mcp.py

這時將會啟動成功。瀏覽器輸入地址 http://127.0.0.1:6274

輸入如下參數:

command

uv

Arguments

run --with mcp mcp run ./mysql-mcp.py

Proxy Session Token 從啟動的控制臺Session Token 復制

點擊連接,即可連接成功。

在這里插入圖片描述

調試MCP工具

連上去后就可以開始調試Tools了。

先點擊list Tools列出MCP服務提供的工具,如上圖。

點擊list_tables,執行run tools

在這里插入圖片描述

可以看出該工具成功返回結果,數據庫中的表,history面板展示了調用工具的請求和返回通信信息。

這里的數據庫連接信息是配置在代碼側的。

其他的工具調試類似。但存在一個問題,這種調試方式是沒法debug的,沒法單步調試的,所以推薦可以對工具函數,單獨寫python代碼進行調試。調試好再同步到MCP服務里。

使用cline連接

開發好MCP服務,就可以用cline去用了。

在 mcp inspector 界面左側面板復制 servers file,然后粘貼到cline的mcp服務配置文檔里(需要調整下),調整后的如下:

"mysql-server": {"disabled": false,"timeout": 60,"type": "stdio","command": "uv","args": ["run","--with","mcp","mcp","run","D:\\source\\mcp\\mysqlmcp\\mysql-mcp.py"]}

點擊連接報錯

在這里插入圖片描述

后面證實這其實不是報錯,只是連接MCP服務的日志信息。

現在是已經正常連接了。

執行數據統計問答

正常連接后,向其提問:

查看數據庫有多少個黨員,并按年齡段統計展示

在這里插入圖片描述

可以看到cline利用LLM,已經為這個問題做好了規劃,一共5步。后續就是按照這5步去執行。

首先,cline識別出了mysql-server的list_tables工具,獲取數據庫所有表

在這里插入圖片描述

其次,調用describ_table工具去獲取表的字段描述

在這里插入圖片描述

再次,對字段進行分析,寫SQL語句

在這里插入圖片描述

執行SQL報錯,自動修改SQL,

在這里插入圖片描述

最終執行成功,返回結果。

經驗總結

1、MCP服務整體開發思路大致是 使用uv初始化環境,寫MCP服務代碼,代碼單點調試,啟用mcp inspector調試、使用cline連接,具體使用;uv虛擬環境有時候感覺需要,有時候又感覺不需要,后續整個全新的項目去研究一下;

2、應用過程中,我在想,使用cline去調用mcp服務的工具,和基于http協議調用接口有啥區別嘞,為啥不能直接去調用http應用的接口嘞?待后續慢慢思考;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87334.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87334.shtml

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

相關文章

OA退位,如何打造安全便捷的跨網文件傳輸與即時通訊平臺?

隨著醫院信息化建設深入推進,OA 系統在日常流程審批和文件流轉中扮演著不可或缺的角色。然而,面對“內網?外網”強隔離的安全要求,OA 在跨域傳輸上仍然存在審批延遲、人工干預、病毒風險等痛點。 一、OA 在跨網傳輸中的 “ 最后一公里 ” 難…

LlamaIndex的多輪對話引擎使用說明

一、背景 LlamaIndex提供2種交互引擎:查詢引擎和聊天引擎。(詳情請看這里)查詢引擎默認沒有上下文信息,也就是說默認是單輪對話。 在RAG系統中,單輪對話/單次查詢的場景較少,而多輪對話則是最常見的場景&…

【CSS-14.1-全局樣式表common.css】構建高效可維護的 common.css:現代前端CSS架構指南

在前端開發中,CSS管理一直是項目可維護性的關鍵挑戰。據統計,約35%的樣式問題源于缺乏統一的CSS架構規范。common.css(或稱全局樣式表)作為項目的基礎樣式層,能夠有效解決以下問題: 樣式碎片化&#xff1a…

laravel基礎:php artisan make:model Flight --all 詳解

在 Laravel 中執行命令: php artisan make:model Flight --all這個命令會為你創建與模型 Flight 相關的一整套文件結構。Laravel 的 Artisan 命令行工具是一個強大的代碼生成器,可以幫助你快速生成常見的應用組件。我們來詳細解析一下這個命令的各個部分以及它產生的效果。 …

poi java 刪除word的空白頁

開發的時候遇到的問題,特此記錄一下 使用Apache POI(Java庫)刪除Word文檔中的空白頁時,需針對不同場景處理。以下是具體實現方法和代碼示例: 基礎刪除(段落/分頁符)? 通過刪除多余段落標記或…

獲取Android應用日志教程

ADB,全稱為Android Debug Bridge,是Android開發中一個重要的命令行工具。它用于與Android設備進行通信,提供了多種功能來幫助開發者進行調試和應用管理。 一、環境準備 1.PC下載附件中的安裝包。 2.在設備上啟用開發者選項和 USB 調試 在安卓…

【Axum】Rust Web 高效構建:Axum 框架從入門到精通指南

目錄 一、環境準備與項目創建1.1 安裝 Rust 工具鏈1.2 創建項目并添加依賴 二、Axum 核心架構解析三、項目結構設計四、核心代碼實現4.1 應用入口 (src/main.rs)4.2 數據模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 認證服務 (src/services/auth.rs)4.5 用戶處理器 (…

康謀分享 | 基于多傳感器數據的自動駕駛仿真確定性驗證

目錄 01 引言 02 隨機性的前因與后果 03 確定性的驗證——以aiSim為例 1、傳感器選型與配置 2、場景與方法 3、驗證結果 04 總結 01 引言 隨著自動駕駛技術的飛速發展,仿真測試已成為替代成本高昂且充滿風險的道路測試的關鍵環節。它能夠在虛擬環境中模擬…

FASTAPI+VUE3平價商貿管理系統

一、項目概述 PJMall 是一個基于 FastAPI 構建的商城管理系統后端服務,提供商品管理、訂單處理、用戶認證等核心功能。系統采用分層架構設計,支持高并發訪問,適用于多角色用戶(管理員、客戶、供應商)。 核心特性 &a…

客服機器人知識庫怎么搭?智能客服機器人3種方案深度對比(含零售落地案例)

一、知識庫技術缺陷的權威數據 IDC 2025報告:89%企業因知識庫更新延遲導致智能客服機器人解決率下降40%,傳統規則引擎日均失效對話超2000次。 二、三大技術方案架構解析 1.LLM動態知識圖譜方案 基于Transformer架構實時抓取政策/價格數據 知識關聯度…

JavaScript 性能優化實戰:減少 DOM 操作引發的重排與重繪

在前端開發中,DOM 操作是 JavaScript 性能優化的核心痛點之一。頻繁的 DOM 操作會觸發瀏覽器的 重排(Reflow) 和 重繪(Repaint),導致性能顯著下降。本文將深入分析這一瓶頸,并通過實際案例展示優…

力扣 hot100 Day33

24. 兩兩交換鏈表中的節點 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,開啟控件AI新時代

WinForms Controls v25.1 AI 驅動的語義搜索 我們的 WinForms 數據網格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增強的搜索體驗,使用戶能夠更快/更準確地在大型數據集中查找相關數據。與基于關鍵字的標準搜索不同,語義搜索利用自然語言處理 &…

【分層圖 虛擬節點】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知識點 C圖論 P11327 [NOISG 2022 Finals] Voting Cities 題目描述 你所在的國家的國家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 將要退休了!他希望選擇他的一個兒子作為他的繼承人,出于各方面因素的考慮,他決定進行…

Web3云服務商安全性怎么選

Web3安全之錨:為何阿里云是企業級應用的首選? 隨著Web3、去中心化金融(DeFi)和數字資產的浪潮席卷全球,無數開發者和企業涌入這個充滿機遇的新賽道。然而,機遇背后是同樣巨大的安全挑戰。從智能合約漏洞到大規模DDoS…

uniapp加上全局水印

文章目錄 一、效果圖二、創建watermark.js文件三、在main.js中引入四、運行 前言:uniapp頁面加水印你還在傻乎乎的一個個頁面加嗎,今天教你一招,一步到位 一、效果圖 未登錄效果 登錄后效果 二、創建watermark.js文件 這里的水印因為我…

thinkphp8.0七牛云直傳圖片

環境&#xff1a;tp8\php8.3; 服務器&#xff1a;centOS Stream 9; 場景&#xff1a;通過html頁面直傳七牛云服務器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全國開發大賽正式啟動

從2023年開始&#xff0c;Godot Hub 每年舉辦一次 Godot Hub Festival 開發大賽&#xff0c;現已成為國內 Godot 社區規模最大的開發比賽。本屆 Godot Hub Festival 2025將與 OpenAtom openKylin 開源社區合作舉辦&#xff0c;定名為 Godot x openKylin 全國開發大賽&#xff0…

工控機Linux修改網口

修改Ip:sudo nmcli connection modify net1-static ipv4.addresses 192.168.200.225/24 修改dns:sudo nmcli connection modify net1-static ipv4.dns 114.114.114.114 修改網關:sudo nmcli connection modify net1-static ipv4.gateway 192.168.200.1 IP生效&#xff1a;nm…

CRMEB Pro版v3.3源碼全開源+PC端+Uniapp前端+搭建教程

一.介紹 crmeb Pro版 v3.3版本正式發布&#xff0c;全新UI重磅上線&#xff0c;煥然一新&#xff0c;不負期待&#xff01;頁面DIY設計功能全面升級&#xff0c;組件更豐富&#xff0c;樣式設計更全面&#xff1b;移動端商家管理&#xff0c;讓商城管理更便捷&#xff0c;還從…