当前位置: 代码网 > it编程>编程语言>Java > Spring AI 实现 STDIO和SSE MCP Server的过程详解

Spring AI 实现 STDIO和SSE MCP Server的过程详解

2025年05月20日 Java 我要评论
spring ai 实现 stdio和sse mcp serverjava mcp 三层架构中,传输的方式有stdio和sse两种,如下图所示。stdio方式是基于进程间通信,mcp client和m

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com