Java SolonMCP 实现 MCP 实践全解析:SSE 与 STDIO 通信模式详解

一、MCP简介

MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年推出的开放标准,旨在统一AI模型与外部数据源、工具之间的通信方式。MCP提供了一套规范化的接口,使大语言模型(LLM)能够更便捷地与各类外部工具和资源进行交互。

通俗点讲是:

一个专属的 RPC 协议

MCP的核心价值在于:

  • 标准化接口:为AI模型提供统一的工具发现和使用接口
  • 安全通信:定义了一套安全的模型与工具之间的通信协议
  • 跨平台兼容:适用于不同AI提供商的模型
  • 提升AI能力:让AI能够访问最新数据和执行复杂操作

二、SolonMCP 简介

SolonMCP(全称 Solon-AI-MCP)是一个基于 Java 的高级框架,专为构建 MCP 服务器而设计。它极大简化了 MCP 服务器的开发流程,让开发者能够以最小的代码量创建功能强大的MCP服务器。

SolonMCP 的主要特点包括:

  • 简洁的 API:通过注解形式,简化MCP服务器的创建
  • 丰富的功能:支持工具(Tools)、资源(Resources)、提示模板(Prompts)等MCP核心元素
  • 多种传输方式:支持 STDIO 和 SSE 等不同传输协议
  • 类型安全:利用 Java 的类型提示,自动生成 MCP 协议所需的模式定义
  • 内置图像处理:支持图像数据的自动格式转换和处理
  • 使用 SolonMCP,开发者可以专注于业务逻辑,而不必过多关注底层协议细节。

Maven 依赖包:

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-mcp</artifactId>
    <version>3.3.1-M1</version>
</dependency>

Gradle 依赖包:

org.noear:solon-ai-mcp:3.3.1-M1

三、Java SolonMCP 实现 STDIO 方式

(1)基本示例

下面是一个使用 SolonMCP 实现 STDIO 通信方式的基本示例,创建一个简单的计算器工具 CalculatorTools:

@McpServerEndpoint(channel = McpChannel.STDIO)
public class CalculatorTools {
    @ToolMapping(description = "将两个数字相加")
    public int add(@Param int a, @Param int b) {
        return a + b;
    }

    @ToolMapping(description = "从第一个数中减去第二个数")
    public int subtract(@Param int a, @Param int b) {
        return a - b;
    }

    @ToolMapping(description = "将两个数相乘")
    public int multiply(@Param int a, @Param int b) {
        return a * b;
    }

    @ToolMapping(description = "将第一个数除以第二个数")
    public float divide(@Param float a, @Param float b) {
        return a / b;
    }
}

在这个示例中,我们:

  • 创建了一个名为 CalculatorTools 的 MCP 服务器实例
  • 使用 @ToolMapping 注解定义了四个计算工具
  • 通过 @McpServerEndpoint(channel = McpChannel.STDIO) 以 STDIO 模式启动服务器

4.2 运行和使用

(先打包成 jar 胖包)运行 STDIO 模式的 MCP 服务器:

java -jar demo.jar

在这种模式下,服务器将等待标准输入上的请求,然后通过标准输出返回响应。所有支持 STDIO 模式的 MCP 客户端(或工具,或中间件),都可以连接使用。

五、Java SolonMCP 实现 SSE 方式

5.1 基本示例

下面是使用 SolonMCP 实现 SSE 通信方式的示例,创建一个简单的天气服务:

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class WeatherTools {
    @ToolMapping(description = "获取指定城市的当前天气")
    public String get_weather(@Param String city) {
        return "{city: '" + city + "', temperature:[10,25], condition:['sunny', 'clear', 'hot'], unit:celsius}";
    }

    //给前端用,需要严格的 json 格式
    @Produces(MimeType.APPLICATION_JSON_VALUE)
    @ResourceMapping(uri = "weather://cities", description = "获取所有可用的城市列表")
    public List<String> get_available_cities() {
        return Arrays.asList("Tokyo", "Sydney", "Tokyo");
    }

    @ResourceMapping(uri = "weather://forecast/{city}", description = "获取指定城市的天气预报资源")
    public String get_forecast(@Param String city) {
         return "{city: '" + city + "', temperature:[10,25], condition:['sunny', 'clear', 'hot'], unit:celsius}";
    }
}

在这个示例中:

  • 我们创建了一个名为 "Weather Service" 的 MCP 服务器
  • 定义了一个 get_weather 工具函数,用于获取城市的当前天气
  • 添加了两个资源:一个返回所有可用城市的列表,另一个返回指定城市的天气预报
  • 通过指定 sseEndpoint 以 SSE 模式启动服务器

5.2 运行和使用

运行 SSE 模式的 MCP 服务器:

java -jar demo.jar

服务器将在指定端口(默认为 8080)启动,并监听HTTP连接。您可以通过浏览器访问:

http://localhost:8080/mcp/sse

要与此服务器交互,可以使用支持 SSE 传输的 MCP 客户端,或者使用如下 Java 代码创建一个简单的客户端:

public void test() {
    McpClientProvider clientProvider = McpClientProvider.builder()
                .apiUrl("http://localhost:8080/mcp/sse")
                .build();

    String rst1 = clientProvider.callToolAsText("get_weather", Map.of("city", "杭州"))
                                .getContent();
                                   
    String rst2 = clientProvider.readResourceAsText("weather://cities")
                                .getContent();
}

六、总结

Java SolonMCP 为开发者提供了一种简单高效的方式来构建 MCP 服务器,无论是使用 STDIO 还是 SSE 传输方式。

原创作者: noear 转载于: https://www.cnblogs.com/noear/p/18871489
### Java SolonMCP 实现 MCP SSESTDIO 的方法 在 Java 中使用 SolonMCP 实现 MCPSSESTDIO 功能,可以通过配置和代码实现来完成。以下是具体的实现方式: #### 1. 配置 JSON 文件 根据提供的引用[^1],可以定义一个 JSON 文件用于配置 MCP 服务器的连接信息。以下是一个示例配置文件: ```json { "mcpServers": { "server1": { "isActive": true, "name": "MySSEService", "type": "sse", "baseUrl": "http://127.0.0.1:8000/sse" }, "server2": { "isActive": true, "name": "MySTDIOService", "type": "stdio", "baseUrl": "http://127.0.0.1:8000/stdio" } } } ``` #### 2. 使用 SolonMCP 连接 SSE 模式 SolonMCP 提供了对 SSE(Server-Sent Events)的支持。以下是实现 SSE 模式的代码示例: ```java import org.noear.solon.mcp.McpClient; import org.noear.solon.mcp.McpConfig; public class SseExample { public static void main(String[] args) { // 加载配置 McpConfig config = McpConfig.load("path/to/config.json"); // 创建客户端 McpClient client = new McpClient(config); // 连接到 SSE 服务 client.connect("server1", (msg) -> { System.out.println("Received message from SSE: " + msg); }, (err) -> { System.err.println("Error in SSE connection: " + err.getMessage()); }); } } ``` 上述代码中,`McpConfig.load` 方法加载配置文件,并通过 `McpClient.connect` 方法连接到指定的 SSE 服务[^1]。 #### 3. 使用 SolonMCP 连接 STDIO 模式 对于 STDIO 模式SolonMCP 提供了类似的接口支持。以下是实现 STDIO 模式的代码示例: ```java import org.noear.solon.mcp.McpClient; import org.noear.solon.mcp.McpConfig; public class StdioExample { public static void main(String[] args) { // 加载配置 McpConfig config = McpConfig.load("path/to/config.json"); // 创建客户端 McpClient client = new McpClient(config); // 连接到 STDIO 服务 client.connect("server2", (msg) -> { System.out.println("Received message from STDIO: " + msg); }, (err) -> { System.err.println("Error in STDIO connection: " + err.getMessage()); }); } } ``` 上述代码中,`client.connect` 方法同样适用于 STDIO 模式,只需指定正确的服务器名称即可。 #### 4. 错误处理日志记录 在实际应用中,建议为每个连接添加详细的错误处理逻辑以及日志记录功能。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ErrorHandlingExample { private static final Logger logger = LoggerFactory.getLogger(ErrorHandlingExample.class); public static void main(String[] args) { McpConfig config = McpConfig.load("path/to/config.json"); McpClient client = new McpClient(config); client.connect("server1", (msg) -> { logger.info("Message received: {}", msg); }, (err) -> { logger.error("Connection error: {}", err.getMessage()); }); } } ``` 通过引入日志框架(如 SLF4J),可以更方便地追踪程序运行状态并排查问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值