搭建基于 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…