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);
    }
}
相关推荐
卷Java1 天前
Linux服务器Docker部署OpenClaw:腾讯云/阿里云/VPS安装避坑指南
linux·运维·服务器
Allnadyy1 天前
【C++项目】从零实现高并发内存池(一):核心原理与设计思路
java·开发语言·jvm
浑水摸鱼仙君1 天前
SpringSecurity和Flux同时使用报未认证问题
java·ai·flux·springsecurity·springai
一叶飘零_sweeeet1 天前
Java 线程模型底层解密:从内核原理到生产级架构选型,全链路实战指南
java· java线程模型
am心1 天前
企业开发项目流程记录
java
小彭努力中1 天前
191.Vue3 + OpenLayers 实战:可控化版权信息(Attribution)详解与完整示例
前端·javascript·vue.js·#地图开发·#cesium
奇舞精选1 天前
用去年 github 最火的 n8n 快速实现自动化推送工具
前端·agent
奇舞精选1 天前
实践:如何为智能体推理引入外部决策步骤
前端·agent
无限大61 天前
AI实战02:一个万能提示词模板,搞定90%的文案/设计/分析需求
前端·后端
独自破碎E1 天前
前后端分离+微服务架构下的用户认证
java·面试·架构