1.搭建服务端
1.1导依赖
XML
复制代码
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<configuration>
<mainClass>com.jiazhong.mingxing.ai.server.AiSiliconflowGlmMcpStdioServer</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.2配置yml文件
XML
复制代码
server:
port: 8009
spring:
ai:
mcp:
server:
stdio: true # 开启stdio
name: ai-mcp-stdio-server # 服务器名称
version: 1.0.0 # 服务器版本
type: sync # 同步模式
main:
banner-mode: off
web-application-type: none
application:
name: ai-mcp-stdio-server
version: 1.0.0
#高德的key
AMAP-KEY:#自己的高德key
1.3配置工具
java
复制代码
package com.jiazhong.mingxing.ai.server.service;
import org.springframework.stereotype.Service;
@Service
public interface WeatherService {
String weather(String city);
}
java
复制代码
package com.jiazhong.mingxing.ai.server.service.impl;
import com.jiazhong.mingxing.ai.server.service.WeatherService;
import jakarta.annotation.Resource;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class WeatherServiceImpl implements WeatherService {
@Resource
private RestTemplate restTemplate;
@Value("${AMAP-KEY}")
private String key;
@Tool(name = "weatherService", description = "获取某个城市的气温")
public String weather(@ToolParam(description = "城市名称") String city) {
String url="https://restapi.amap.com/v3/weather/weatherInfo?key="+
key + "&city=" + city + "&extensions=all";
return restTemplate.getForObject(url,String.class);
}
}
1.4启动类
java
复制代码
package com.jiazhong.mingxing.ai.server;
import com.jiazhong.mingxing.ai.server.service.WeatherService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class AiSiliconflowGlmMcpStdioServer {
@Bean("restTemplate")
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(AiSiliconflowGlmMcpStdioServer.class,args);
}
@Bean("reg")
public ToolCallbackProvider reg(WeatherService weatherService){
return MethodToolCallbackProvider.builder()
.toolObjects(weatherService)
.build();
}
}
1.5打包为jar
2.配置服务端
2.1导包
XML
复制代码
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</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-web</artifactId>
</dependency>
</dependencies>
2.2配置 yml文件
XML
复制代码
server:
port: 8010
spring:
application:
name: ai-siliconflow-advisor-glm
ai:
openai:
base-url: https://api.siliconflow.cn
api-key: sk-rlpneielwjrtbzwghvmtnkrfzsqoorkclubnimumojlptvqz
chat:
options:
model: "zai-org/GLM-4.6"
temperature: 0.7
mcp:
client:
enabled: true # 启⽤MCP客户端
name: ai-mcp-stdio-client # MCP客户端名称
version: 1.0.0 # 客户端版本
initialized: true # ⾃动初始化客户端
request-timeout: 20s # 请求超时时间
type: sync # 客户端类型为同步模式
root-change-notification: true # 启⽤客户端变更通知
toolcallback:
enabled: true # 启⽤⼯具回调 与Spring AI⼯具执⾏框架集成
stdio:
servers-configuration: classpath:/stdio-server-config.json
2.3写配置类
java
复制代码
package com.jiazhong.mingxing.ai.client.config;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ChatClientConfig {
@Resource
private OpenAiChatModel openAiChatModel;
@Resource
private ToolCallbackProvider reg;
@Bean("openAiChatClient")
public ChatClient openAiChatClient(){
return ChatClient.builder(openAiChatModel)
.defaultToolCallbacks(reg)
.build();
}
}
2.4写controller类
java
复制代码
package com.jiazhong.mingxing.ai.client.controller;
import io.modelcontextprotocol.client.McpAsyncClient;
import io.modelcontextprotocol.client.McpSyncClient;
import io.modelcontextprotocol.spec.McpSchema;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.List;
@RestController
@RequestMapping("/stdio_client")
public class StdioClientController {
@Resource
private ChatClient openAiChatClient;
// 同步客户端
@Autowired
private List<McpSyncClient> mcpSyncClients;
@GetMapping(value = "/a", produces = "text/html;charset=utf-8")
public Flux<String> a(@RequestParam("question") String question) {
System.out.println("===================================================");
System.out.println("length:" + mcpSyncClients.size());
for (McpSyncClient client : mcpSyncClients) {
McpSchema.ListToolsResult listToolsResult = client.listTools();
System.out.println("这个是我的工具");
List<McpSchema.Tool> tools = listToolsResult.tools();
for (McpSchema.Tool tool : tools) {
System.out.println(tool.name());
}
}
System.out.println("===================================================");
return openAiChatClient.prompt()
.user(question)
.stream().content();
}
}
2.5写Json文件
java
复制代码
{
"mcpServers": {
"mcp-server": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dlogging.pattern.console=",
"-Dfile.encoding=UTF-8",
"-jar",
"D:\\code\\jiazhong-mingxing-01\\jiazhong-ai\\ai-siliconflow-glm-mcp-stdio-client\\src\\main\\resources\\ai-siliconflow-glm-mcp-stdio-server-3.5.3.jar" //服务端打包的jar包的绝对路径
],
"env": {}
}
}
}
2.6启动类
java
复制代码
package com.jiazhong.mingxing.ai.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AiSiliconflowGlmMcpStdioClient {
public static void main(String[] args) {
SpringApplication.run(AiSiliconflowGlmMcpStdioClient.class,args);
}
}