搭建基于 Solon AI 的 Streamable MCP 服務并部署至阿里云百煉

一、快速搭建 Solon 項目,引入 Solon AI

1. 開發環境準備

  • JDK 8 或以上版本。
  • Maven 3.8.6 或以上版本。
  • 通義千問 API Key(用于模型調用)。

2. 創建名為 mcp-server-demo 的項目

創建時選擇 Archetype 為 Solon AI(可以減少些活),會自動添加 Solon AI、MCP 相關依賴。

創建后可以再簡化下 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.noear</groupId><artifactId>solon-parent</artifactId><version>3.5.1</version><relativePath /></parent><groupId>com.example</groupId><artifactId>solon-bailian-mcp-workflow-server</artifactId><version>1.0</version><packaging>jar</packaging><description>Demo project for Solon</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.noear</groupId><artifactId>solon-web</artifactId></dependency><dependency><groupId>org.noear</groupId><artifactId>solon-ai-mcp</artifactId></dependency><dependency><groupId>org.noear</groupId><artifactId>solon-logging-logback</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.noear</groupId><artifactId>solon-test</artifactId><scope>test</scope></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.noear</groupId><artifactId>solon-maven-plugin</artifactId></plugin></plugins></build>
</project>

二、添加 Mcp Server 并添加兩個工具

使用 @McpServerEndpoint 注解,就像 MVC 開發一樣簡單。name 為 mcp-server-demo(可以按需設定),channel 使用 McpChannel.STREAMABLE(表示用 streamable 傳輸方式),mcpEndpoint 為 /mcp(可以按需設定)。

支持多個端點。就像 MVC 開發有多個控制器,每個控制器可以有自己的前綴地址。

import org.noear.solon.Utils;
import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;import java.util.List;//工具,會再調用 dashscope 的模型。
@McpServerEndpoint(name = "mcp-server-demo", channel = McpChannel.STREAMABLE, mcpEndpoint = "/mcp")
public class McpToolServer {@ToolMapping(description = "批量生成標題")public List<String> BatchGenerateTitles(String title) {String SystemPrompt = "# 角色\n" +"你是一位專業的批量生成標題助手,擅長根據用戶提供的提示快速生成高質量的標題。\n" +"\n" +"## 技能\n" +"### 技能1:理解用戶需求\n" +"- 仔細閱讀并理解用戶提供的提示和要求。\n" +"- 根據用戶的輸入,確定標題的主題、風格和目標受眾。\n" +"\n" +"### 技能2:創意標題生成\n" +"- 能夠在短時間內生成多個具有吸引力和多樣性的標題。\n" +"- 確保每個標題都符合用戶的需求,并且能夠吸引目標受眾的注意力。\n" +"\n" +"### 技能3:標題優化\n" +"- 對生成的標題進行優化,確保它們簡潔明了、易于理解。\n" +"- 考慮到SEO優化,合理嵌入關鍵詞以提高標題的可發現性。\n" +"\n" +"### 技能4:多樣化風格\n" +"- 能夠生成不同風格的標題,如新聞報道式、故事敘述式、疑問式等。\n" +"- 根據不同的使用場景(如博客文章、社交媒體帖子、新聞報道等)調整標題的風格和長度。\n" +"\n" +"## 限制\n" +"- 生成的標題數量為20個。\n" +"- 每個標題應簡潔明了,不超過20個字。\n" +"- 所有標題必須與用戶提供的提示和要求一致。\n" +"- 避免使用過于復雜或難以理解的語言。\n" +"- 如果需要特定領域的專業知識,可以通過調用搜索工具或查詢知識庫來獲取相關信息。";String UserPrompt = "用戶輸入內容如下:" + title;String reTitle = null;try {reTitle = callWithMessage(SystemPrompt, UserPrompt);} catch (Exception e) {return Utils.asList("錯誤:" + e.getMessage());}if (reTitle == null) {return Utils.asList("錯誤:生成標題失敗");}return Utils.asList(reTitle);}@ToolMapping(description = "文章潤色")public List<String> polishTheArticle(String content) {String SystemPrompt = "# 角色\n" +"你是一位專業的文章潤色助手,擅長提升文章的語言表達、邏輯結構和整體流暢性。你的任務是根據用戶提供的原始文本,進行細致的潤色,使文章更加清晰、生動和有說服力。\n" +"\n" +"## 技能\n" +"### 技能 1: 語言潤色\n" +"- 優化文章中的詞匯選擇,使其更加精準和生動。\n" +"- 調整句子結構,使文章更加流暢自然。\n" +"- 修正語法錯誤和拼寫錯誤,確保文章的專業性和準確性。\n" +"\n" +"### 技能 2: 邏輯結構優化\n" +"- 重新組織段落順序,使文章的邏輯更加清晰。\n" +"- 添加或刪除內容,以增強文章的連貫性和一致性。\n" +"- 提供適當的過渡句,使各部分之間的銜接更加自然。\n" +"\n" +"### 技能 3: 內容豐富與精簡\n" +"- 根據需要添加更多細節,使文章內容更加豐富和具體。\n" +"- 刪除冗余信息,使文章更加簡潔明了。\n" +"- 保持文章的主題和核心思想不變,同時提升其吸引力和可讀性。\n" +"\n" +"### 技能 4: 風格調整\n" +"- 根據用戶的指示調整文章的風格,如正式、幽默、輕松等。\n" +"- 確保文章的風格與目標受眾相匹配。\n" +"- 保持一致的語氣和語調,增強文章的整體效果。\n" +"\n" +"## 限制\n" +"- 只對用戶提供的一篇文章進行潤色,不涉及其他文檔。\n" +"- 潤色過程中保持原文的核心內容和意圖不變。\n" +"- 不得添加或刪除與文章主題無關的內容。\n" +"- 如果用戶提供了特定的風格要求,請嚴格遵循這些要求進行潤色。\n" +"- 在潤色時,注意保留用戶的個人風格和聲音,避免過度修改。";String UserPrompt = "原始文本內容如下:" + content;String ReContent = null;try {ReContent = callWithMessage(SystemPrompt, UserPrompt);} catch (Exception e) {return Utils.asList("錯誤:" + e.getMessage());}if (ReContent == null) {return Utils.asList("錯誤:文章潤色失敗");}return Utils.asList(ReContent);}public String callWithMessage(String systemPrompt, String userPrompt) throws Exception {ChatModel chatModel = ChatModel.of("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions").apiKey(System.getenv("DASHSCOPE_API_KEY")).model("qwen-plus").build();return chatModel.prompt(ChatMessage.ofSystem(systemPrompt), ChatMessage.ofUser(userPrompt)).call().getContent();}
}

提示:不需要別的配置或注冊了。

三、添加測試類,簡單試下效果

通過測試注解 @SolonTest(App.class) 啟動服務端,通過 McpClientProvider 連接服務端并獲取所有工具。

import com.example.mcp_server.App;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.noear.solon.ai.chat.tool.FunctionTool;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.client.McpClientProvider;
import org.noear.solon.test.SolonTest;import java.util.Collection;@Slf4j
@SolonTest(App.class)
public class McpClientTest {@Testpublic void clientTest() {McpClientProvider clientProvider = McpClientProvider.builder().url("http://localhost:8080/mcp").channel(McpChannel.STREAMABLE).build();//獲取所有工具Collection<FunctionTool> tools = clientProvider.getTools();log.error("{}", tools);}
}

單測運行效果:

四、項目打包并部署

打包,并生成 mcp-server-demo.jar

發布到自己的服務器(可用 java -jar mcp-server-demo.jar 運行)。或者,上傳到阿里云函數(界面太多,略過…)

五、將部署好的 Streamable MCP 集成到百煉當中

按照界面引導,添加配置(界面太多,略過…)。

后續,可以進一步創建智能體使用 Streamable MCP (界面太多,略過…)

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

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

相關文章

免費的SSL和付費SSL 證書差異

免費的 SSL 和付費的 SSL&#xff08;TLS 證書&#xff09;本質上提供的加密能力是一樣的&#xff0c;因為 SSL/TLS 協議本身是開放標準&#xff0c;核心加密算法不會因為是否收費而不同。主要區別在于以下幾個方面&#xff1a;&#x1f511; 1. 加密強度免費 SSL&#xff1a;一…

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試344.反轉字符串I思路541.反轉字符串II題目理解解題思路邊界細節reverse()函數的實現[kamacoder54.替換數字 -- 第八期模擬筆試](https://kamacoder.com/p…

計算機視覺——光流法

系列文章目錄 本系列開篇文章&#xff0c;暫時沒有目錄啦&#xff5e; 文章目錄系列文章目錄前言一、問題假設二、方程推導三、計算Ix,Iy,ItI_x,I_y,I_tIx?,Iy?,It?四、計算光流u,vu,vu,v4.1 傳統算法Lucas-Kanade算法五、孔徑問題5.1 直觀理解5.2 數學角度5.3 解決方法總結…

前端安全攻防:XSS, CSRF 等防范與檢測

前端安全攻防&#xff1a;XSS, CSRF 等防范與檢測在Web應用日益普及的今天&#xff0c;前端安全已經成為一個不容忽視的重要環節。隨著攻擊技術的不斷演進&#xff0c;各種前端安全漏洞&#xff08;如跨站腳本攻擊 XSS、跨站請求偽造 CSRF 等&#xff09;層出不窮&#xff0c;它…

03OpenCV圖像處理

參考課程&#xff1a; 【黑馬程序員 OpenCV入門教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 1.1幾何變換 圖像縮放 對圖像的大小進行調整&#xff0c;即使圖像放大或縮小 cv2.resize(src, dsize, fx0, fy0, interpolationcv2.INTER_LINEAR)參數…

UE5 C++ 第三方動態庫的使用

一. 首先要拷貝對應的 第三方庫 bin里有dll動態庫&#xff0c;include里有動態庫需要的頭文件。 二.在Target.cs里&#xff0c;進行設置 頭文件前面的路徑為公共路徑 設置需要一起打包的三方庫文件 三.加載這個庫 FPlatformProcess::GetDllHandle將他解析為 任意類型&#x…

C++進階——多態

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、多態的概念 二、多態的定義及實現 2.1、多態的構成條件 &#xff08;1&#xff09;虛函…

Swift 語法學習指南 - 與 Kotlin 對比

Swift 語法學習指南 - 與 Kotlin 對比 本指南專為有 Android/Kotlin 開發經驗的開發者設計&#xff0c;通過對比學習快速掌握 Swift 語法 目錄 語言基礎對比變量與常量數據類型函數定義類與結構體繼承與協議可選類型集合類型控制流閉包與Lambda擴展與Extension錯誤處理內存管理…

嵌入式C語言筆記十七——構造數據類型

一.結構體&#xff1a;1.類型定義&#xff1a;struct 結構體名 {數據類型1 成員變量1;數據類型2 成員變量2;數據類型3 成員變量3;... };struct student {char name[32];char sex;int age;int score; };2.結構體變量定義&#xff1a;存儲類型 數據類型 變量名;3.結構體元素初始化…

深入實踐G1垃圾收集器調優:Java應用性能優化實戰指南

深入實踐G1垃圾收集器調優&#xff1a;Java應用性能優化實戰指南 一、技術背景與應用場景 隨著微服務和海量并發請求的普及&#xff0c;Java應用在生產環境中對低延遲和高吞吐的需求日益顯著。傳統的CMS和Parallel GC 在大內存場景下常出現Full GC 停頓時間長、吞吐下降等問題…

【JobScheduler】Android 后臺任務調度的核心組件指南

JobScheduler 是 Android 平臺上原生支持在直接啟動模式&#xff08;Direct Boot Mode&#xff09;下執行任務的調度器。 相比 WorkManager 需要復雜的配置才能勉強支持直接啟動&#xff0c;JobScheduler 在這方面有著天生的優勢和明確的 API 支持。如果你面臨的硬性要求是必須…

c# 調用basler 相機

目錄 一聯合halcon&#xff1a; 二 c# 原生 一聯合halcon&#xff1a; 環境配置 下載安裝pylon軟件 下載安裝halcon 創建 winform項目 test_basler 添加引用 打開pylon可以連接相機 可以看到我的相機id為23970642 &#xff08; c#聯合halcon的基礎教程&#xff08;案例…

《2025年AI產業發展十大趨勢報告》四十六

《2025年AI產業發展十大趨勢報告》四十六隨著科技的迅猛發展&#xff0c;人工智能&#xff08;AI&#xff09;作為引領新一輪科技革命和產業變革的戰略性技術&#xff0c;正逐步滲透到各個行業和領域&#xff0c;成為推動經濟社會發展的重要引擎。2023年&#xff0c;生成式AI的…

c++ 雜記

1. 為什么返回*this?2. 3. 友元函數的使用&#xff1a;需要頭文件中類內外聲明&#xff0c;cpp文件中實現定義哦// Sales_data.h #ifndef SALES_DATA_H #define SALES_DATA_H#include <string>class Sales_data {std::string bookNo;int units_sold 0;double revenue …

PDF文件基礎-計算機字體

計算機字體的原理包含了字符編碼、字形渲染和字體文件存儲三個關鍵技術。 字符編碼負責將每個字符映射到一個唯一的數字碼&#xff1b;字形渲染則將這些數字碼轉換成屏幕或紙張上可識別的圖形&#xff1b;字體文件存儲則包含了字符的編碼、圖形描述信息以及字體的其他屬性&…

華為IP(9)

OSPF的基本配置OSPF路由計算前言&#xff1a;1)同一區域內的OSPF路由器擁有完全一致的LSDB&#xff0c;在區域內部&#xff0c;OSPF采用SPF算法完成路由計算。2&#xff09;隨著網絡規模不斷擴大&#xff0c;路由器為了完成路由計算所消耗的內存、CPU資源也越來越多。通過區域劃…

java.nio.file.InvalidPathException異常

一.問題概述 本人在ubuntu22.04的操作系統上&#xff0c;運行java程序時創建一個文件時&#xff0c;由于文件名稱中包含了中文&#xff0c;所以導致了程序拋出了java.nio.file.InvalidPathException的異常。 java.nio.file.InvalidPathException: Malformed input or input co…

Next系統總結學習(一)

下面我按題號逐條 詳細 解釋并給出示例與最佳實踐。為便于閱讀&#xff0c;我會同時給出關鍵代碼片段&#xff08;偽代碼/實用例子&#xff09;&#xff0c;并指出常見坑與解決方案。 1. 你是如何理解服務端渲染&#xff08;SSR&#xff09;的&#xff1f;它的核心工作流程是怎…

房屋安全鑒定需要什么條件

房屋安全鑒定需要什么條件&#xff1a;專業流程與必備要素解析房屋安全鑒定是保障建筑使用安全的重要環節&#xff0c;它通過對建筑結構、材料性能及使用狀況的全面評估&#xff0c;為房屋的安全使用、改造或維護提供科學依據。隨著城市建筑老化及自然災害頻發&#xff0c;房屋…

現代C++:現代C++?

C語言正在走向完美&#xff0c;所以&#xff0c;C語言值得學習&#xff08;甚至研究&#xff09;&#xff0c;這些知識可以成為一切編程的基礎。然而在實踐中&#xff0c;不必全面的使用C語言的各種特性&#xff0c;而應根據工程項目的實際情況&#xff0c;適當取舍&#xff08…