一、快速搭建 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 (界面太多,略過…)