搭建基于 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 {
@Test
public 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 (界面太多,略过...)
搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼的更多相关文章
- 【hexo博客搭建】将搭建好的hexo博客部署到阿里云服务器上面(下)
一.部署到阿里云服务器 既然博客也已经成功在本地部署,然后主题也成功安装,接下来就可以部署到服务器上面了,如果你也想要魔改matery主题,可以去各种博客上面找一找大佬的教程,或者联系我,也可以让你少 ...
- Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)
# 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...
- 边缘节点服务ENS重磅升级 阿里云首次定义“边缘云计算”概念层层深入
随着5G.物联网时代的到来以及云计算应用的逐渐增加,传统集中式的云计算技术已经无法满足终端侧“大连接,低时延,大带宽”的需求.结合边缘计算的概念,云计算将必然发展到下一个技术阶段,也就是将云计算的能力 ...
- 短视频服务大PK,阿里云、腾讯云、又拍云、七牛云、金山云5强横向对比
继直播后,短视频又再次爆发,在这个风口,国内的各大云厂商也都相继推出了自己的一站式短视频解决方案.上周由于公司短视频功能开发的需要,对比了阿里云.腾讯云.又拍云.七牛云.金山云5家的短视频服务. 先介 ...
- ACK容器服务虚拟节点使用阿里云日志服务来收集业务容器日志
按照这篇博文的介绍,可以在ACK集群上通过Helm的方式部署虚拟节点,提升集群的弹性能力.现在,通过虚拟节点部署的ECI弹性容器实例也支持将stdout输出.日志文件同步到阿里云日志服务(SLS)进行 ...
- SpringBoot搭建基于Spring+SpringMvc+Mybatis的REST服务
Maven Plugin管理 通常,让你的Maven POM文件继承 spring-boot-starter-parent,并声明一个或多个 Starter POMs依赖即可. spring-boot ...
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...
- 搭建基于hyperledger fabric的联盟社区(一) --前言
三个月前上面发了一个关于智群汇聚和问题求解研究的项目,我们公司做其中的一个子项目,就是基于区块链的科技信息联盟构建.利用区块链的去中心化特性,构建一个基于区块链的科技社区,以提供科技群智汇聚采集的基础 ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...
- 阿里云朱照远: AI打开新视界 8K时代已来!
2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛.电视云论坛.短视频论坛.视频云论坛.新技术论坛.运营商论坛.国际云论坛等7大部分组成.在亚太CDN领袖峰会上 ...
随机推荐
- 100条常用SQL语句
一.基本查询语句 查询所有数据: SELECT * FROM 表名; 查询特定列: SELECT 列名1, 列名2 FROM 表名; 条件查询: SELECT * FROM 表名 WHERE 条件; ...
- SQL Server AVG函数取整问题
SQL Sever的均值函数在求整数类型的数据均值是结果还是整数,并且不会四舍五入.也就是向下取整.这里先创建一个成绩表,并适当添加数据. CREATE TABLE sic( 学号 nchar(10) ...
- css3桃花随意飘落
桃花随意飘落 css3 + js 不实用第三方类库 效果图 <!DOCTYPE html> <html lang="en"> <head> &l ...
- 想让自己的Ubuntu更漂亮嘛?
近期没啥大项目在进行,今天闲来无事,值班空闲时间,忽然发现自己的Ubuntu竟是如此的"丑"(虽然用过这么多Linux发行版,但不得不承认Ubuntu唯一的优点就是好看!),于是准 ...
- Avalonia硬配.NET Framework 4.8
Warning:这种方法能保证运行初始项目,但至于有没有什么其他问题我就不知道了,根据Avalonia官网的说法,Avalonia基于.NET Standard 2.0构建,该标准涵盖从.NET Fr ...
- 谷云科技RestCloud全面接入DeepSeek 开启智能新时代
在数字化转型的浪潮中,谷云科技始终走在数据集成与智能应用领域的前沿.近期,随着 DeepSeek 的火爆出圈,谷云科技紧跟技术趋势,对旗下两大核心产品 -- 数据集成软件 ETLCloud 和 AI ...
- SciTech-BigDataAIML-Github-Generating a new GPG key
Generating a new GPG key Generating a new GPG key If you don't have an existing GPG key, you can gen ...
- LINUX与Minix之间-九五小庞
Linus Torvalds(托瓦兹, 1969年出生, [10])的外祖父是赫尔辛基大学的统计学家, 他的外祖 父为了让自己的小孙子能够学点东西,所以从小就将托瓦兹带到身边来管理一些微计算机. ...
- win11专业版打开安全中心变成应用商店的问题
有一位雨林木风官网的小伙伴,反馈这么一个问题,当他用win11专业版系统的时候,点击安全中心时,会有提示要求您启动应用商店,不知道是哪里出了问题!面对这个问题,很多人不知道如何解决.然后本期win11 ...
- 搜索&记忆化(重复子问题,逻辑相同)
中序遍历:左儿子,我,右儿子 点击查看代码 void dfs(int u) { if(u > n) return ; dfs(u + 1); cout << u << e ...