打造一個支持MySQL查詢的MCP同步插件:Java實現

打造一個支持MySQL查詢的MCP同步插件:Java實現

用Java實現一個MCP本地插件,直接通過JDBC操作本地MySQL,并通過STDIO與上層MCP客戶端(例如Cursor)通信。插件注冊一個名為mysql
的同步工具,接收連接參數及SQL查詢,執行后將結果以JSON返回。目錄結構、完整代碼及在Cursor中的示例配置如下。

摘要

我們基于 Model Context Protocol Java SDK 實現了一個簡單的 MCP Server 插件,它:

  1. 在 Server 啟動時注冊一個名為 mysql 的工具(SyncToolSpecification),其參數定義包括 hostuserpassword
    databasequery 等字段。

  2. 在工具處理器中利用 MySQL 官方 JDBC 驅動(mysql-connector-java)連接數據庫,執行查詢,并將每行結果封裝為 JSON 數組返回。

  3. 打包為可執行 JAR 后,通過命令行啟動,Cursor 中配置類似于:

    {"mcpServers": {"mysql": {"command": "java","args": ["-jar", "/Users/changmeng.yuan.o/Desktop/mysql-server-mcp-java-demo/target/mysql-server-mcp-java-demo-1.0.0.jar"],"env": {"MYSQL_HOST": "localhost","MYSQL_USER": "root","MYSQL_PASSWORD": "875213MenG...","MYSQL_DATABASE": "test"}}}
    

}


即可在對話中直接調用 `mysql` 工具執行任意查詢并獲取結果。## 依賴在 `pom.xml` 中聲明以下關鍵依賴:* **MCP 核心 SDK**(包含 STDIO Server 傳輸實現)```xml
<dependency><groupId>io.modelcontextprotocol.sdk</groupId><artifactId>mcp</artifactId><version>0.9.0</version>
</dependency>
  • MySQL JDBC 驅動
    可以用新版的 mysql-connector-j

     <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.2.0</version></dependency>
    

    (來自 MySQL 官方 Maven 中心)

  • Jackson 用于 JSON 序列化(可選,STDIO Transport 已自帶,但我們手動構造 JSON)

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version>
    </dependency>
    

目錄結構

mcp-mysql-plugin/
├── pom.xml
└── src└── main├── java│   └── com│       └── example│           └── mcpmysql│               ├── Main.java│               └── MysqlTool.java└── resources└── application.properties

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.codeyuan.mcpmysql</groupId><artifactId>mysql-server-mcp-java-demo</artifactId><version>1.0.0</version><properties><!-- 指定 Java 版本 --><java.version>17</java.version><mcp.version>0.9.0</mcp.version><jackson.version>2.15.2</jackson.version><mysql.connector.version>8.2.0</mysql.connector.version><!-- 用于 Maven Compiler Plugin 的 release 配置 --><maven.compiler.release>${java.version}</maven.compiler.release></properties><dependencies><!-- MCP core SDK with STDIO transport --><dependency><groupId>io.modelcontextprotocol.sdk</groupId><artifactId>mcp</artifactId><version>${mcp.version}</version></dependency><!-- MySQL JDBC --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.connector.version}</version></dependency><!-- Jackson JSON --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies><build><plugins><!-- 1. Maven Compiler: 指定 Java 版本,支持文本塊 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.14.0</version><configuration><!-- 一次性設置 source、target 和標準庫版本 --><release>${maven.compiler.release}</release></configuration></plugin><!-- 2. Maven Shade: 打包為 fat-jar --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.5.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><!-- 去除依賴中的簽名文件等,避免沖突 --><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><!-- 指定主類 --><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.codeyuan.mcpmysql.Main</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
</project>

Main.java

package com.codeyuan.mcpmysql;import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.McpSyncServer;
import io.modelcontextprotocol.server.transport.StdioServerTransportProvider;
import io.modelcontextprotocol.spec.McpSchema;/*** main主函數方法* @author codeyuan*/
public class Main {public static void main(String[] args) throws InterruptedException {// 1) 使用 STDIO 傳輸層啟動服務器var transportProvider = new StdioServerTransportProvider(new ObjectMapper());// 2) 構建并啟動同步 MCP Server,啟用工具執行能力McpSyncServer server = McpServer.sync(transportProvider)// 配置一下  Server 信息.serverInfo("mysql-plugin", "1.0.0").capabilities(McpSchema.ServerCapabilities.builder()// 開啟工具支持.tools(true).build())// build() 方法會立即啟動服務器并監聽輸入:contentReference[oaicite:6]{index=6}.build();// 3) 注冊自定義 MySQL 工具// addTool 可在運行時動態添加工具:contentReference[oaicite:7]{index=7}server.addTool(MysqlTool.specification());// 4) 在 JVM 退出時優雅關閉服務器// close() 用于關閉傳輸并釋放資源:contentReference[oaicite:8]{index=8}Runtime.getRuntime().addShutdownHook(new Thread(server::close));// 5) 阻塞主線程,保持進程存活// join() 阻塞主線程,防止 JVM 退出:contentReference[oaicite:9]{index=9}Thread.currentThread().join();}
}

說明:基于文檔示例,使用 McpServer.sync(...) 構建同步服務器,開啟 tools 功能,并注冊我們自定義的工具。

MysqlTool.java

package com.codeyuan.mcpmysql;import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.server.McpServerFeatures;
import io.modelcontextprotocol.spec.McpSchema;import java.sql.*;
import java.util.*;/*** 執行連接操作mysql* 支持 SELECT 和非 SELECT 類型語句* @author codeyuan*/
public class MysqlTool {private static final ObjectMapper JSON = new ObjectMapper();// 定義工具規格:name、description、JSON 參數 schemapublic static McpServerFeatures.SyncToolSpecification specification() {String schema = """{"type": "object","properties": {"host":     { "type": "string" },"user":     { "type": "string" },"password": { "type": "string" },"database": { "type": "string" },"query":    { "type": "string" }},"required": ["host","user","password","database","query"]}""";McpSchema.Tool tool = new McpSchema.Tool("mysql", "Execute SQL on MySQL", schema);return new McpServerFeatures.SyncToolSpecification(tool, (exchange, arguments) -> {try {// 提取參數String host = arguments.get("host").toString();String user = arguments.get("user").toString();String pass = arguments.get("password").toString();String db   = arguments.get("database").toString();String sql  = arguments.get("query").toString().trim();String url  = String.format("jdbc:mysql://%s/%s?useSSL=false&allowMultiQueries=true", host, db);try (Connection conn = DriverManager.getConnection(url, user, pass);Statement stmt = conn.createStatement()) {if (sql.toLowerCase().startsWith("select")) {try (ResultSet rs = stmt.executeQuery(sql)) {List<Map<String, Object>> rows = new ArrayList<>();ResultSetMetaData meta = rs.getMetaData();int colCount = meta.getColumnCount();while (rs.next()) {Map<String, Object> row = new LinkedHashMap<>();for (int i = 1; i <= colCount; i++) {row.put(meta.getColumnLabel(i), rs.getObject(i));}rows.add(row);}Map<String, Object> result = Map.of("rows", rows);return new McpSchema.CallToolResult(String.valueOf(result), false);}} else {int affected = stmt.executeUpdate(sql);Map<String, Object> result = Map.of("affectedRows", affected);return new McpSchema.CallToolResult(String.valueOf(result), false);}}} catch (Exception e) {// 錯誤時將異常信息返回return new McpSchema.CallToolResult(String.valueOf(Map.of("error", e.getMessage())), false);}});}
}

application.properties

(可用于默認值配置,示例中未使用;所有參數均從工具調用時傳入或環境變量讀取。)

# 可在此預置 host, user, password, database 等默認值

打包與發布

# 編譯并打包為 fat-jar
mvn clean package
# 生成目標: target/mcp-mysql-plugin-1.0.0.jar

將生成的 JAR 上傳或放置在可訪問路徑,然后在 Cursor 等 MCP 客戶端中配置:

{"mcpServers": {"mysql": {"command": "java","args": ["-jar","/absolute/path/to/mcp-mysql-plugin-1.0.0.jar"],"env": {"MYSQL_HOST": "localhost","MYSQL_USER": "root","MYSQL_PASSWORD": "secret","MYSQL_DATABASE": "testdb"}}}
}

調用示例(在對話中):

{"tool": "mysql","arguments": {"host": "localhost","user": "root","password": "secret","database": "testdb","query": "SELECT * FROM users LIMIT 10"}
}

即可返回如下 JSON 結構:

{"rows": [{"id": 1,"name": "Alice","email": "alice@example.com"}]
}

獲取直接使用自然語言對話

我是用的數據庫版本是8.0,給我創建一個用戶表,用戶表可能存在,表中有姓名、年紀、性別、地址等字段,模擬插入10條數據

cursor-mysql-mcp-test-1.jpg

cursor-mysql-mcp-test-2.jpg

參考文檔:

  1. https://modelcontextprotocol.io/sdk/java/mcp-server “MCP Server - Model Context Protocol”
  2. https://modelcontextprotocol.io/sdk/java/mcp-overview “Overview - Model Context Protocol”

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
下面關注回復【mysql-server-mcp-java-demo】
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

相關文章

【數據架構01】數據技術架構篇

? 9張高質量數據架構圖&#xff1a;大數據平臺功能架構、數據全生命周期管理圖、AI技術融合架構等&#xff1b; &#x1f680;無論你是數據架構師、治理專家&#xff0c;還是數字化轉型負責人&#xff0c;這份資料庫都能為你提供體系化參考&#xff0c;高效解決“架構設計難、…

java三種常見設計模式,工廠、策略、責任鏈

設計模式實戰解析 一、工廠模式&#xff08;點外賣模式&#xff09; 1. 核心思想 代替直接new對象像點外賣一樣獲取對象 2. 實際應用 Spring框架&#xff1a;BeanFactoryJDBC&#xff1a;DriverManager.getConnection() 3. 三種變體對比 類型特點示例場景簡單工廠一個工…

jenkins使用Send build artifacts over SSH發布jar包目錄配置

本測試用ruoyi-plus的代碼。 1 [GitLab 自動觸發 Jenkins 構建_jenkins構建觸發器沒有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

vscode打開vue + element項目

好嘞&#xff0c;我幫你詳細整理一個用 VS Code 來可視化開發 Vue Element UI 的完整步驟&#xff0c;讓你能舒服地寫代碼、預覽界面、調試和管理項目。 用 VS Code 可視化開發 Vue Element UI 全流程指南 一、準備工作 安裝 VS Code 官網下載安裝&#xff1a;https://code…

黑馬程序員C++2024新版筆記 第4章 函數和結構體

目錄 1.結構體的基本應用 2.結構體成員的默認值 3.結構體數組 4.結構體指針 ->操作符 5.結構體指針數組 1.引入已存在的結構體數組地址 2.通過new操作符申請指針數組空間 6.函數的概念 7.函數的基礎語法 8.無返回值函數和void類型 9.空參函數 10.函數的嵌套調用…

高級前端工程師必備的 JS 設計模式入門教程,常用設計模式案例分享

目錄 高級前端工程師必備的 JS 設計模式入門教程&#xff0c;常用設計模式案例分享 一、什么是設計模式&#xff1f;為什么前端也要學&#xff1f; 1、設計模式是什么 2、設計模式的產出 二、設計模式在 JS 里的分類 三、常用設計模式實戰講解 1、單例模式&#xff08;S…

Ubuntu+Docker+內網穿透:保姆級教程實現安卓開發環境遠程部署

文章目錄 前言1. 虛擬化環境檢查2. Android 模擬器部署3. Ubuntu安裝Cpolar4. 配置公網地址5. 遠程訪問小結 6. 固定Cpolar公網地址7. 固定地址訪問 前言 本文將詳細介紹一種創新性的云開發架構&#xff1a;基于Ubuntu系統構建Android仿真容器環境&#xff0c;并集成安全隧道技…

Linux Kernel調試:強大的printk(一)

引言 想了好久&#xff0c;還是覺得這個標題才配得上printk&#xff01;^_^ 我相信&#xff0c;不管做什么開發&#xff0c;使用最多的調試手段應該就是打印了&#xff0c;從我們學習編程語言第一課開始&#xff0c;寫的第一段代碼&#xff0c;就是打印"Hello, world&qu…

基于NLP技術的客戶投訴與需求文本分類方法研究

目錄 摘要 1. 引言 2. 文本分類基礎 2.1 文本分類的定義與類型 2.2 文本分類的評價指標 3. 傳統文本分類方法 3.1 基于TF-IDF和SVM的方法 3.2 基于主題模型和詞向量的改進方法 4. 深度學習文本分類方法 4.1 TextCNN模型 4.2 BiLSTM模型 4.3 注意力機制與Transformer…

#RabbitMQ# 消息隊列入門

目錄 一 MQ技術選型 1 運行rabbitmq 2 基本介紹 3 快速入門 1 交換機負責路由消息給隊列 2 數據隔離 二 Java客戶端 1 快速入門 2 WorkQueue 3 FanOut交換機 4 Direct交換機 5 Topic交換機 *6 聲明隊列交換機 1 在配置類當中聲明 2 使用注解的方式指定 7 消息轉…

【深度學習】多目標融合算法(六):漸進式分層提取模型PLE(Progressive Layered Extraction)

目錄 一、引言 二、PLE&#xff08;Progressive Layered Extraction&#xff0c;漸進式分層提取模型&#xff09; 2.1 技術原理 2.2 技術優缺點 2.3 業務代碼實踐 2.3.1 業務場景與建模 2.3.2 模型代碼實現 2.3.3 模型訓練與推理測試 2.3.4 打印模型結構 三、總結 一…

【Java開發日記】如何使用Java開發在線生成 pdf 文檔

一、介紹 在實際的業務開發的時候&#xff0c;研發人員往往會碰到很多這樣的一些場景&#xff0c;需要提供相關的電子憑證信息給用戶&#xff0c;例如網銀&#xff0f;支付寶&#xff0f;微信購物支付的電子發票、訂單的庫存打印單、各種電子簽署合同等等&#xff0c;以方便用…

Oracle 11g 單實例使用+asm修改主機名導致ORA-29701 故障分析

解決 把服務器名修改為原來的&#xff0c;重啟服務器。 故障 建表空間失敗。 分析 查看告警日志 ORA-1119 signalled during: create tablespace splex datafile ‘DATA’ size 2000M… Tue May 20 18:04:28 2025 create tablespace splex datafile ‘DATA/option/dataf…

消息隊列的使用

使用內存隊列來處理基于內存的【生產者-消費者】場景 思考和使用Disruptor Disruptor可以實現單個或多個生產者生產消息&#xff0c;單個或多個消費者消息&#xff0c;且消費者之間可以存在消費消息的依賴關系 使用Disruptor需要結合業務特性&#xff0c;設計要靈活 什么業務…

《帝國時代1》游戲秘籍

資源類 PEPPERONI PIZZA&#xff1a;獲得 1000 食物。COINAGE&#xff1a;獲得 1000 金。WOODSTOCK&#xff1a;獲得 1000 木頭。QUARRY&#xff1a;獲得 1000 石頭。 建筑與生產類 STEROIDS&#xff1a;快速建筑。 地圖類 REVEAL MAP&#xff1a;顯示所有地圖。NO FOG&#xf…

使用JSP踩過的坑

雖然說jsp已經過時了&#xff0c;但是有時維護比較老的項目還是需要的。 下面說下&#xff0c;我使用jsp踩過的坑&#xff1a; 1.關于打印輸出 在jsp中輸出使用 out.println("hello");而不是 System.out.println("hello");如果在定義函數部分需要打印…

redis集群創建時手動指定主從關系的方法

適用場景&#xff1a; 創建主從關系時默認參數 --cluster-replicas 1 會自動分配從節點。 為了能精確控制 Redis Cluster 的主從拓撲結構&#xff0c;我們通過 Redis Cluster 的手動分片功能來實現 一、手動指定主從關系的方法 使用 redis-cli --cluster-replicas 0 先創建純…

ROS合集(七)SVIn2聲吶模塊分析

文章目錄 一、整體思想二、具體誤差建模流程三、總結明確&#xff08;預測值與觀測值&#xff09;四、選點邏輯五、Sonar 數據處理流水線1. ROS Launch 配置&#xff08;imagenex831l.launch&#xff09;2. SonarNode 節點&#xff08;sonar_node.py&#xff09;3. Subscriber …

Python爬蟲實戰:研究PySpider框架相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、市場調研等領域發揮著重要作用。隨著互聯網信息的爆炸式增長,如何高效、穩定地獲取所需數據成為了一個關鍵挑戰。PySpider 作為一款功能強大的 Python 爬蟲框架,提供了豐富的功能…

《大模型開源與閉源的深度博弈:科技新生態下的權衡與抉擇》

開源智能體大模型的核心魅力&#xff0c;在于它構建起了一個全球開發者共同參與的超級協作網絡。想象一下&#xff0c;來自世界各個角落的開發者、研究者&#xff0c;無論身處繁華都市還是偏遠小鎮&#xff0c;只要心懷對技術的熱愛與追求&#xff0c;就能加入到這場技術狂歡中…