jFinal 使用 SolonMCP 開發 MCP(擁抱新潮流)

MCP 官方的 java-sdk 目前只支持 java17+。直接基于 mcp-java-sdk 也比較復雜。使用 SolonMCP,可以基于 java8 開發(像 MVC 的開發風格),且比較簡單。

1、SolonMCP 簡介

SolonMCP(全稱:solon-ai-mcp)是 solon 的一個擴展。支持內嵌到 jfinal,vert.x,springboot2,springboot3 等框架使用。

Maven 主要依賴包:

<dependency><groupId>org.noear</groupId><artifactId>solon-ai-mcp</artifactId>
</dependency>

具體的示例參考:

  • https://gitee.com/opensolon/solon-ai-mcp-embedded-examples/tree/main/solon-ai-embedded-jfinal
  • https://gitee.com/opensolon/solon-ai-mcp-embedded-examples/tree/main/solon-ai-embedded-jfinal-newstyle

2、MCP 服務端開發

2.1、添加入口類 webapp.HelloApp(比較空,注意下 mcpServerConfig)

MCP 內部是基于響應式的,需要開啟異步支持。

public class HelloApp extends JFinalConfig {public static void main(String[] args) {UndertowServer.create(HelloApp.class).setDevMode(false).setPort(8080).onDeploy((cl, di) -> {di.getFilters().get("jfinal").setAsyncSupported(true); //注意這個,要開啟異步支持}).start();}public void configConstant(Constants me) {me.setDevMode(false);}public void configRoute(Routes me) {}public void configEngine(Engine me) {}public void configPlugin(Plugins me) {me.add(mcpServerConfig);}public void configInterceptor(Interceptors me) {}public void configHandler(Handlers me) {me.add(mcpServerConfig);}private McpServerConfig mcpServerConfig = new McpServerConfig();
}
2.2、添加 webapp.mcpserver.McpServerConfig(實現 Handler、IPlugin 接口)

實現 IPlugin 對接 Solon 的生命周期。實現 Handler 對接 mcp 的請求處理。

public class McpServerConfig extends Handler implements IPlugin {public boolean start() {Solon.start(McpServerConfig.class, new String[]{"--cfg=mcpserver.yml"});return true;}public boolean stop() {if (Solon.app() != null) {Solon.stopBlock(false, Solon.cfg().stopDelay());}return true;}@Overridepublic void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {if (target.startsWith("/mcp/")) {Context ctx = new SolonServletContext(request, response);try {//Solon處理(可能是空處理)Solon.app().tryHandle(ctx);if (isHandled != null && isHandled.length > 0) {isHandled[0] = true;}} catch (Throwable e) {ctx.errors = e;throw e;} finally {ContextUtil.currentRemove();}} else {if (next != null) {next.handle(target, request, response, isHandled);}}}
}
2.3、添加 webapp.mcpserver.tool.McpServer(實現 Handler、IPlugin 接口)

這里是重點了,添加 mcp server 端點(支持多個端點)

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class McpServer {//// 建議開啟編譯參數:-parameters (否則,最好再配置參數的 name)//@ToolMapping(description = "查詢天氣預報")public String getWeather(@Param(description = "城市位置") String location) {return "晴,14度";}@ResourceMapping(uri = "config://app-version", description = "獲取應用版本號")public String getAppVersion() {return "v3.2.0";}@ResourceMapping(uri = "db://users/{user_id}/email", description = "根據用戶ID查詢郵箱")public String getEmail(@Param(description = "用戶Id") String user_id) {return user_id + "@example.com";}@PromptMapping(description = "生成關于某個主題的提問")public Collection<ChatMessage> askQuestion(@Param(description = "主題") String topic) {return Arrays.asList(ChatMessage.ofUser("請解釋一下'" + topic + "'的概念?"));}
}
2.4、編譯后運行

或者開發時,直接運行 HelloApp:main 方法

3、MCP 客戶端開發

客戶端簡單些

public class McpClientTest {public static void main(String[] args) throws Exception {McpClientProvider toolProvider = McpClientProvider.builder().apiUrl("http://localhost:8080/mcp/sse").build();//工具調用Map<String, Object> map = Collections.singletonMap("location", "杭州");String rst = toolProvider.callToolAsText("getWeather", map).getContent();System.out.println(rst);assert "晴,14度".equals(rst);//資源讀取resourceContent = toolProvider.readResourceAsText("config://app-version").getContent();System.out.println(resourceContent);}
}

4、MCP 客戶端作為 LLM(ChatModel) 的工具集使用

也比較簡單。使用 ollama 做為 llm 提供者,方便本地測試。

public class McpClientTest {private static final String apiUrl = "http://127.0.0.1:11434/api/chat";private static final String provider = "ollama";private static final String model = "qwen2.5:1.5b"; //"llama3.2";//deepseek-r1:1.5b;public static void main(String[] args) throws Exception {//構建 mcp clientMcpClientProvider toolProvider = McpClientProvider.builder().apiUrl("http://localhost:8080/mcp/sse").build();//構建 llm 接口ChatModel chatModel = ChatModel.of(apiUrl).provider(provider).model(model).defaultToolsAdd(toolProvider) //添加默認工具(這是 mcp client).build();//請求ChatResponse resp = chatModel.prompt("杭州今天的天氣怎么樣?").call();System.out.println(resp.getMessage());}
}

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

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

相關文章

“端 - 邊 - 云”三級智能協同平臺的理論建構與技術實現

摘要 隨著低空經濟與智能制造的深度融合&#xff0c;傳統集中式云計算架構在實時性、隱私保護和資源效率上的瓶頸日益凸顯。本文提出“端 - 邊 - 云”三級智能協同平臺架構&#xff0c;以“時空 - 資源 - 服務”三維協同理論為核心&#xff0c;構建覆蓋終端感知、邊緣計算、云端…

【如何搭建開發環境】

了解java程序 JAVA體系結構 跨平臺原理與編譯和反編譯 如何學習java語言&#xff0c;如何搭建環境 設置JAVA_HOME&#xff0c;指向jdk的安裝目錄這一級即可。比如我的JDK安裝在C:\java\jdk1.8.0_25&#xff0c;那JAVA_HOME的值就是C:\java\jdk1.8.0_25設置Path變量 在Path值后…

LegoGPT,卡內基梅隆大學推出的樂高積木設計模型

LegoGPT 是由卡內基梅隆大學開發的一款創新性樂高積木設計模型&#xff0c;能夠根據用戶的文本提示生成結構穩固、可組裝的樂高模型。該模型基于自回歸語言模型和大規模樂高設計數據集進行訓練&#xff0c;用戶只需輸入簡單的文字描述&#xff0c;LegoGPT 就能逐步構建出物理穩…

深入理解 NumPy:Python 科學計算的基石

在數據科學、人工智能和科學計算的世界里&#xff0c;NumPy 是一塊繞不過去的基石。它是 Python 語言中用于高性能科學計算的基礎包&#xff0c;幾乎所有的數據分析與機器學習框架&#xff08;如 Pandas、TensorFlow、Scikit-learn&#xff09;都離不開它的支持。 一、什么是 …

Java基礎(IO)

所有操作都在內存&#xff0c;不能長時間保存&#xff0c;IO主要在硬盤&#xff0c;可以長時間保存。 一、File類 File類被定義為文件和目錄路徑名的抽象表示形式&#xff0c;這是因為 File 類既可以表示文件也可以表示目錄&#xff0c;他們都通過對應的路徑來描述。 提供構…

仿正點原子驅動BMP280氣壓傳感器實例

文章目錄 前言 一、寄存器頭文件定義 二、設備樹文件中添加節點 三、驅動文件編寫 四、編寫驅動測試文件并編譯測試 總結 前言 本文驅動開發仿照正點原子的iic驅動實現&#xff0c;同時附上bmp280的數據手冊&#xff0c;可訪問下面的鏈接&#xff1a; BMP280_Bosch(博世…

論壇系統(中-1)

軟件開發 編寫公共代碼 定義狀態碼 對執?業務處理邏輯過程中可能出現的成功與失敗狀態做針對性描述(根據需求分析階段可以遇見的問題提前做出定義)&#xff0c;?枚舉定義狀態碼&#xff0c;先定義?部分&#xff0c;業務中遇到新的問題再添加 定義狀態碼如下 狀態碼類型描…

E+H流量計通過Profibus DP主站轉Modbus TCP網關與上位機輕松通訊

EH流量計通過Profibus DP主站轉Modbus TCP網關與上位機輕松通訊 在現代工業自動化的廣闊舞臺上&#xff0c;Profibus DP與Modbus TCP這兩種通信協議各領風騷&#xff0c;它們在不同的應用場景中發揮著舉足輕重的作用。但工業生產的復雜性往往要求不同設備、系統之間能夠順暢溝…

服務器中存儲空間不足該怎么辦?

服務器作為存儲數據信息的重要網絡設備&#xff0c;隨著企業業務的不斷拓展&#xff0c;所需要存儲的數據信息也在不斷增加&#xff0c;最終會導致服務器中存儲空間不足&#xff0c;這不僅會影響到服務器系統性能&#xff0c;還會造成業務無法正常執行&#xff0c;那么&#xf…

C++23 views::chunk_by (P2443R1) 詳解

文章目錄 引言C23 范圍庫概述范圍視圖&#xff08;Range Views&#xff09;范圍算法&#xff08;Range Algorithms&#xff09;范圍適配器&#xff08;Range Adapters&#xff09; std::views::chunk_by 介紹基本概念特性使用場景 示例代碼簡單示例自定義謂詞示例 總結 引言 在…

零碳園區能源系統-多能互補體系

構建以可再生能源為核心的零碳園區能源系統&#xff0c;需整合光儲直柔、光伏發電、微電網、氫能與儲能技術&#xff0c;通過多能協同與智能調控實現能源生產、存儲、消費全鏈條優化。以下是系統性實施方案&#xff1a; 一、系統架構設計 1. 多能互補體系 &#xff08;圖示&a…

elastic search學習

首先在自己電腦上安裝elastic search。安裝成功后&#xff0c;查看ES是否啟動成功。 安裝過程參考&#xff1a;ElasticSearch入門1: mac 安裝 - 霜井 - 博客園 安裝完成后&#xff0c;直接執行bin目錄中的elastic search命令后&#xff0c;就可以啟動成功&#xff01; 在網頁…

mysql8常用sql語句

查詢結果帶行號 -- 表名為 mi_user&#xff0c; 假設包含列 id &#xff0c;address SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, t.id, t.address FROM mi_user t ; SELECT ROW_NUMBER() OVER ( ) AS row_num, t.id, t.address FROM mi_user t ; 更新某列數…

Memcached 服務搭建和集成使用的詳細步驟示例

以下是 Memcached 服務搭建和集成使用的詳細步驟示例&#xff1a; 一、搭建 Memcached 服務 安裝 Memcached Linux 系統 yum 安裝&#xff1a;執行命令 yum install -y memcached memcached-devel。源碼安裝 下載源碼&#xff1a;wget http://www.memcached.org/files/memcach…

2. 盒模型/布局模塊 - 響應式產品展示頁_案例:電商產品網格布局

2. 盒模型/布局模塊 - 響應式產品展示頁 案例&#xff1a;電商產品網格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…

Go基于plugin的熱更新初體驗

背景 對于一個部署在生產環境的項目來說&#xff0c;我們希望當代碼出現bug的時候&#xff0c;可以不用重啟進程而達到動態修改代碼的目的—— 這就是代碼熱部署&#xff01; 使用java做游戲服務器&#xff0c;最大的好處是&#xff0c;當代碼出現bug&#xff0c;可以直接熱…

【RabbitMQ】工作隊列和發布/訂閱模式的具體實現

文章目錄 建立連接工作隊列模式實現創建隊列和交換機生產者代碼消費者代碼運行程序啟動消費者啟動生產者 發布/訂閱模式實現創建隊列和交換機生產者代碼創建交換機聲明兩個隊列綁定隊列和交換機發送消息完整代碼 消費者代碼完整代碼 運行程序啟動生產者啟動消費者 建立連接 我…

Codeforces Round 998 (Div. 3)

A. Fibonacciness 題目大意 給你四個數字abde&#xff0c;讓你找到一個中間值c&#xff0c;問 a b c a b c abc &#xff0c; b c d b c d bcd &#xff0c; c d e c d e cde 最多能有幾個式子成立 解題思路 顯然最多就六種情況&#xff0c;暴力枚舉即可 代…

火山引擎發展初始

火山引擎是字節跳動旗下的云計算服務品牌&#xff0c;其云服務業務的啟動和正式商業化時間線如下&#xff1a; 1. **初期探索&#xff08;2020年之前&#xff09;** 字節跳動在早期為支持自身業務&#xff08;如抖音、今日頭條等&#xff09;構建了強大的基礎設施和技術中…

【認知思維】光環效應:第一印象的持久力量

什么是光環效應 光環效應&#xff08;Halo Effect&#xff09;是指人們傾向于讓對某人或某物的一個顯著特質的印象影響對其他特質的評價的認知偏差。簡單來說&#xff0c;當我們對某人的一個特質&#xff08;如外表、智力或某項技能&#xff09;形成積極印象時&#xff0c;我們…