spring ai 实现 stdio和sse mcp server
java mcp 三层架构中,传输的方式有stdio和sse两种,如下图所示。
stdio方式是基于进程间通信,mcp client和mcp server运行在同一主机,主要用于本地集成、命令行工具等场景。
sse方式是基于http协议,mcp client远程调用mcp server提供的sse服务。实现客户端和服务端远程通信。
sse server
spring-ai-starter-mcp-server-webflux
基于webflux sse 实现sse server。
<dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-server-webflux</artifactid> </dependency>
mcp 服务端功能支持基于 spring webflux 的 sse(服务器发送事件)服务器传输和可选的 stdio 传输。
1.新建spring boot项目
使用https://start.spring.io/新建项目,引入以下依赖。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>3.4.4</version> <relativepath/> <!-- lookup parent from repository --> </parent> <groupid>com.mcp.example</groupid> <artifactid>mcp-webflux-server-example</artifactid> <version>0.0.1-snapshot</version> <name>mcp-webflux-server-example</name> <description>mcp-webflux-server-example</description> <dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-bom</artifactid> <version>1.0.0-snapshot</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-server-webflux</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> <repositories> <repository> <name>central portal snapshots</name> <id>central-portal-snapshots</id> <url>https://central.sonatype.com/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>spring milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <name>spring snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> </project>
2.application.yaml配置
spring: ai: mcp: server: name: webflux-mcp-server version: 1.0.0 type: async # recommended for reactive applications sse-message-endpoint: /mcp/messages
定义mcp名称和版本号以及同步或异步配置。
3.定义工具类
@service public class datetimeservice { @tool(description = "get the current date and time in the user's timezone") string getcurrentdatetime() { return localdatetime.now().atzone(localecontextholder.gettimezone().tozoneid()).tostring(); } @tool(description = "set a user alarm for the given time, provided in iso-8601 format") string setalarm(string time) { localdatetime alarmtime = localdatetime.parse(time, datetimeformatter.iso_date_time); return "alarm set for " + alarmtime; } }
定义二个工具:
1.获取当前日期和时间
2.设置提醒功能
4.暴露工具
@configuration public class mcpwebfluxserviceexampleconfig { @bean public toolcallbackprovider datetimetools(datetimeservice datetimeservice) { return methodtoolcallbackprovider.builder().toolobjects(datetimeservice).build(); } }
5.启动mcp server项目
启动项目发现注册的两个工具成功,可以端可以发现两个工具。到此mcp server服务完成,sse的端点路径:http://localhost:9090
,接下来是客户端连接使用服务端提供的工具。
6.mcp client连接mcp server
1.新建spring boot项目,然后引入starter
<dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-client</artifactid> </dependency>
完整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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>3.4.4</version> <relativepath/> <!-- lookup parent from repository --> </parent> <groupid>com.mcp.example</groupid> <artifactid>mcp-client-example</artifactid> <version>0.0.1-snapshot</version> <name>mcp-client-example</name> <description>mcp-client-example</description> <dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-bom</artifactid> <version>1.0.0-snapshot</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-openai-spring-boot-starter</artifactid> <version>1.0.0-snapshot</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-client</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> <repositories> <repository> <name>central portal snapshots</name> <id>central-portal-snapshots</id> <url>https://central.sonatype.com/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>spring milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <name>spring snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> </project>
2.配置
spring: ai: openai: api-key: 你自己密钥 base-url: https://api.siliconflow.cn chat: options: model: qwen/qwen2.5-72b-instruct mcp: client: sse: connections: server1: url: http://localhost:9090 toolcallback: enabled: true server: port: 9091
配置文件内容,大模型配置方便测试工具使用,mcp服务端设置就是mcp server提供的sse端点。
toolcalback.enable=true 自动注入spring ai toolcallbackprovider。
3.测试
package com.mcp.example.mcpclientexample; import io.modelcontextprotocol.client.mcpasyncclient; import jakarta.annotation.resource; import org.springframework.ai.chat.client.chatclient; import org.springframework.ai.mcp.syncmcptoolcallbackprovider; import org.springframework.ai.tool.toolcallback; import org.springframework.ai.tool.toolcallbackprovider; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.commandlinerunner; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import java.util.arrays; import java.util.list; @springbootapplication public class mcpclientexampleapplication implements commandlinerunner { @resource private toolcallbackprovider tools; @resource chatclient.builder chatclientbuilder; public static void main(string[] args) { springapplication.run(mcpclientexampleapplication.class, args); } @override public void run(string... args) throws exception { var chatclient = chatclientbuilder .defaulttools(tools) .build(); string content = chatclient.prompt("10分钟后,设置一个闹铃。").call().content(); system.out.println(content); string content1 = chatclient.prompt("明天星期几?").call().content(); system.out.println(content1); } }
运行客户端项目:
结果表明定义的工具大模型根据用户的提问,选择了合适的工具进行回答。
stdio server
标准 mcp 服务器,通过 stdio 服务器传输支持完整的 mcp 服务器功能。
<dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-server</artifactid> </dependency>
1.创建server项目
新建spring boot项目引入以下依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>3.4.4</version> <relativepath/> <!-- lookup parent from repository --> </parent> <groupid>com.mcp.example</groupid> <artifactid>mcp-stdio-server-example</artifactid> <version>0.0.1-snapshot</version> <name>mcp-stdio-server-example</name> <description>mcp-stdio-server-example</description> <dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-bom</artifactid> <version>1.0.0-snapshot</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.ai</groupid> <artifactid>spring-ai-starter-mcp-server</artifactid> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> <repositories> <repository> <name>central portal snapshots</name> <id>central-portal-snapshots</id> <url>https://central.sonatype.com/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>spring milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <name>spring snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> </project>
配置文件application.yaml
spring: ai: mcp: server: name: stdio-mcp-server version: 1.0.0 stdio: true main: banner-mode: off web-application-type: none logging: pattern: console: server: port: 9090
main:
banner-mode: off
web-application-type: none 这个配置非常关键,否则client与server通信会提示json解析有问题。这个必须关掉。
2.新建工具
与sse server一样,新建datetimetool并注册。
3.打包项目
stdio方式server和client之间是进程间通信,所以需要把server打包成jar,以便client命令启动执行,或者三方客户端命令启动执行。将server jar放到一个指定目录,如下所示:
target/mcp-stdio-server-example.jar
4.创建client项目
直接使用上面sse server使用的 clinet,修改对应配置文件application.yaml
和新建mcp-server配置json。mcp-servers-config.json
。
{ "mcpservers": { "stdio-mcp-server": { "command": "java", "args": [ "-dspring.ai.mcp.server.stdio=true", "-dspring.main.web-application-type=none", "-jar", "mcp server正确的路径 ../mcp-stdio-server-example-0.0.1-snapshot.jar" ], "env": {} } } }
application.yaml
spring: ai: openai: api-key: sk-qwkegvacbfpsctyhfgakxlwfnklinwjunjyfmonnxddmcixr base-url: https://api.siliconflow.cn chat: options: model: qwen/qwen2.5-72b-instruct mcp: client: # sse: # connections: # server1: # url: http://localhost:9090 stdio: root-change-notification: false servers-configuration: classpath:/mcp-servers-config.json toolcallback: enabled: true server: port: 9091
5.启动客户端
到此这篇关于spring ai 实现 stdio和sse mcp server的过程详解的文章就介绍到这了,更多相关spring ai stdio和sse mcp server内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论