SpringAI-mcp-入门案例

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);
    }
}
相关推荐
小陈工14 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
问简18 小时前
虚拟化对比
服务器
一定要AK19 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao19 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
xiaotao13119 小时前
第九章:Vite API 参考手册
前端·vite·前端打包
午安~婉19 小时前
Electron桌面应用聊天(续)
前端·javascript·electron
KevinCyao19 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
航Hang*19 小时前
Windows Server 配置与管理——第3章:文件系统管理
运维·服务器·windows·vmware
迷藏49419 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
lifewange19 小时前
Linux ps 进程查看命令详解
linux·运维·服务器