找回密码
 立即注册
首页 业界区 业界 搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿 ...

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

蚣澡 2025-9-30 11:48:11
一、快速搭建 Solon 项目,引入 Solon AI

1. 开发环境准备


  • JDK 8 或以上版本。
  • Maven 3.8.6 或以上版本。
  • 通义千问 API Key(用于模型调用)。
2. 创建名为 mcp-server-demo 的项目

创建时选择 Archetype 为 Solon AI(可以减少些活),会自动添加 Solon AI、MCP 相关依赖。
1.png
创建后可以再简化下 pom.xml :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <parent>
  7.         <groupId>org.noear</groupId>
  8.         solon-parent</artifactId>
  9.         <version>3.5.1</version>
  10.         <relativePath />
  11.     </parent>
  12.     <groupId>com.example</groupId>
  13.     solon-bailian-mcp-workflow-server</artifactId>
  14.     <version>1.0</version>
  15.    
  16.     <packaging>jar</packaging>
  17.     <description>Demo project for Solon</description>
  18.     <properties>
  19.         <java.version>1.8</java.version>
  20.     </properties>
  21.     <dependencies>
  22.         <dependency>
  23.             <groupId>org.noear</groupId>
  24.             solon-web</artifactId>
  25.         </dependency>
  26.         
  27.         <dependency>
  28.             <groupId>org.noear</groupId>
  29.             solon-ai-mcp</artifactId>
  30.         </dependency>
  31.         
  32.         <dependency>
  33.             <groupId>org.noear</groupId>
  34.             solon-logging-logback</artifactId>
  35.         </dependency>
  36.         
  37.         <dependency>
  38.             <groupId>org.projectlombok</groupId>
  39.             lombok</artifactId>
  40.             <scope>provided</scope>
  41.         </dependency>
  42.         <dependency>
  43.             <groupId>org.noear</groupId>
  44.             solon-test</artifactId>
  45.             <scope>test</scope>
  46.         </dependency>
  47.     </dependencies>
  48.     <build>
  49.         <finalName>${project.artifactId}</finalName>
  50.         <plugins>
  51.             <plugin>
  52.                 <groupId>org.noear</groupId>
  53.                 solon-maven-plugin</artifactId>
  54.             </plugin>
  55.         </plugins>
  56.     </build>
  57. </project>
复制代码
二、添加 Mcp Server 并添加两个工具

使用 @McpServerEndpoint 注解,就像 MVC 开发一样简单。name 为 mcp-server-demo(可以按需设定),channel 使用 McpChannel.STREAMABLE(表示用 streamable 传输方式),mcpEndpoint 为 /mcp(可以按需设定)。
支持多个端点。就像 MVC 开发有多个控制器,每个控制器可以有自己的前缀地址。
  1. import org.noear.solon.Utils;
  2. import org.noear.solon.ai.annotation.ToolMapping;
  3. import org.noear.solon.ai.chat.ChatModel;
  4. import org.noear.solon.ai.chat.message.ChatMessage;
  5. import org.noear.solon.ai.mcp.McpChannel;
  6. import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;
  7. import java.util.List;
  8. //工具,会再调用 dashscope 的模型。
  9. @McpServerEndpoint(name = "mcp-server-demo", channel = McpChannel.STREAMABLE, mcpEndpoint = "/mcp")
  10. public class McpToolServer {
  11.     @ToolMapping(description = "批量生成标题")
  12.     public List<String> BatchGenerateTitles(String title) {
  13.         String SystemPrompt = "# 角色\n" +
  14.                 "你是一位专业的批量生成标题助手,擅长根据用户提供的提示快速生成高质量的标题。\n" +
  15.                 "\n" +
  16.                 "## 技能\n" +
  17.                 "### 技能1:理解用户需求\n" +
  18.                 "- 仔细阅读并理解用户提供的提示和要求。\n" +
  19.                 "- 根据用户的输入,确定标题的主题、风格和目标受众。\n" +
  20.                 "\n" +
  21.                 "### 技能2:创意标题生成\n" +
  22.                 "- 能够在短时间内生成多个具有吸引力和多样性的标题。\n" +
  23.                 "- 确保每个标题都符合用户的需求,并且能够吸引目标受众的注意力。\n" +
  24.                 "\n" +
  25.                 "### 技能3:标题优化\n" +
  26.                 "- 对生成的标题进行优化,确保它们简洁明了、易于理解。\n" +
  27.                 "- 考虑到SEO优化,合理嵌入关键词以提高标题的可发现性。\n" +
  28.                 "\n" +
  29.                 "### 技能4:多样化风格\n" +
  30.                 "- 能够生成不同风格的标题,如新闻报道式、故事叙述式、疑问式等。\n" +
  31.                 "- 根据不同的使用场景(如博客文章、社交媒体帖子、新闻报道等)调整标题的风格和长度。\n" +
  32.                 "\n" +
  33.                 "## 限制\n" +
  34.                 "- 生成的标题数量为20个。\n" +
  35.                 "- 每个标题应简洁明了,不超过20个字。\n" +
  36.                 "- 所有标题必须与用户提供的提示和要求一致。\n" +
  37.                 "- 避免使用过于复杂或难以理解的语言。\n" +
  38.                 "- 如果需要特定领域的专业知识,可以通过调用搜索工具或查询知识库来获取相关信息。";
  39.         String UserPrompt = "用户输入内容如下:" + title;
  40.         String reTitle = null;
  41.         try {
  42.             reTitle = callWithMessage(SystemPrompt, UserPrompt);
  43.         } catch (Exception e) {
  44.             return Utils.asList("错误:" + e.getMessage());
  45.         }
  46.         if (reTitle == null) {
  47.             return Utils.asList("错误:生成标题失败");
  48.         }
  49.         return Utils.asList(reTitle);
  50.     }
  51.     @ToolMapping(description = "文章润色")
  52.     public List<String> polishTheArticle(String content) {
  53.         String SystemPrompt = "# 角色\n" +
  54.                 "你是一位专业的文章润色助手,擅长提升文章的语言表达、逻辑结构和整体流畅性。你的任务是根据用户提供的原始文本,进行细致的润色,使文章更加清晰、生动和有说服力。\n" +
  55.                 "\n" +
  56.                 "## 技能\n" +
  57.                 "### 技能 1: 语言润色\n" +
  58.                 "- 优化文章中的词汇选择,使其更加精准和生动。\n" +
  59.                 "- 调整句子结构,使文章更加流畅自然。\n" +
  60.                 "- 修正语法错误和拼写错误,确保文章的专业性和准确性。\n" +
  61.                 "\n" +
  62.                 "### 技能 2: 逻辑结构优化\n" +
  63.                 "- 重新组织段落顺序,使文章的逻辑更加清晰。\n" +
  64.                 "- 添加或删除内容,以增强文章的连贯性和一致性。\n" +
  65.                 "- 提供适当的过渡句,使各部分之间的衔接更加自然。\n" +
  66.                 "\n" +
  67.                 "### 技能 3: 内容丰富与精简\n" +
  68.                 "- 根据需要添加更多细节,使文章内容更加丰富和具体。\n" +
  69.                 "- 删除冗余信息,使文章更加简洁明了。\n" +
  70.                 "- 保持文章的主题和核心思想不变,同时提升其吸引力和可读性。\n" +
  71.                 "\n" +
  72.                 "### 技能 4: 风格调整\n" +
  73.                 "- 根据用户的指示调整文章的风格,如正式、幽默、轻松等。\n" +
  74.                 "- 确保文章的风格与目标受众相匹配。\n" +
  75.                 "- 保持一致的语气和语调,增强文章的整体效果。\n" +
  76.                 "\n" +
  77.                 "## 限制\n" +
  78.                 "- 只对用户提供的一篇文章进行润色,不涉及其他文档。\n" +
  79.                 "- 润色过程中保持原文的核心内容和意图不变。\n" +
  80.                 "- 不得添加或删除与文章主题无关的内容。\n" +
  81.                 "- 如果用户提供了特定的风格要求,请严格遵循这些要求进行润色。\n" +
  82.                 "- 在润色时,注意保留用户的个人风格和声音,避免过度修改。";
  83.         String UserPrompt = "原始文本内容如下:" + content;
  84.         String ReContent = null;
  85.         try {
  86.             ReContent = callWithMessage(SystemPrompt, UserPrompt);
  87.         } catch (Exception e) {
  88.             return Utils.asList("错误:" + e.getMessage());
  89.         }
  90.         if (ReContent == null) {
  91.             return Utils.asList("错误:文章润色失败");
  92.         }
  93.         return Utils.asList(ReContent);
  94.     }
  95.     public String callWithMessage(String systemPrompt, String userPrompt) throws Exception {
  96.         ChatModel chatModel = ChatModel.of("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions")
  97.                 .apiKey(System.getenv("DASHSCOPE_API_KEY"))
  98.                 .model("qwen-plus")
  99.                 .build();
  100.         return chatModel.prompt(ChatMessage.ofSystem(systemPrompt), ChatMessage.ofUser(userPrompt))
  101.                 .call()
  102.                 .getContent();
  103.     }
  104. }
复制代码
提示:不需要别的配置或注册了。
三、添加测试类,简单试下效果

通过测试注解 @SolonTest(App.class) 启动服务端,通过 McpClientProvider 连接服务端并获取所有工具。
  1. import com.example.mcp_server.App;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.junit.jupiter.api.Test;
  4. import org.noear.solon.ai.chat.tool.FunctionTool;
  5. import org.noear.solon.ai.mcp.McpChannel;
  6. import org.noear.solon.ai.mcp.client.McpClientProvider;
  7. import org.noear.solon.test.SolonTest;
  8. import java.util.Collection;
  9. @Slf4j
  10. @SolonTest(App.class)
  11. public class McpClientTest {
  12.     @Test
  13.     public void clientTest() {
  14.         McpClientProvider clientProvider = McpClientProvider.builder()
  15.                 .url("http://localhost:8080/mcp")
  16.                 .channel(McpChannel.STREAMABLE)
  17.                 .build();
  18.         //获取所有工具
  19.         Collection<FunctionTool> tools = clientProvider.getTools();
  20.         log.error("{}", tools);
  21.     }
  22. }
复制代码
单测运行效果:
2.png
四、项目打包并部署

打包,并生成 mcp-server-demo.jar
3.png
发布到自己的服务器(可用 java -jar mcp-server-demo.jar 运行)。或者,上传到阿里云函数(界面太多,略过...)
五、将部署好的 Streamable MCP 集成到百炼当中

按照界面引导,添加配置(界面太多,略过...)。
4.png
后续,可以进一步创建智能体使用 Streamable MCP (界面太多,略过...)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册