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);
    }
}
相关推荐
程序猿的程4 分钟前
开源一个 React 股票 K 线图组件,传个股票代码就能画图
前端·javascript
不爱说话郭德纲31 分钟前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
唐叔在学习1 小时前
[前端特效] 左滑显示按钮的实现介绍
前端·javascript
用户5282290301801 小时前
【学习笔记】ECMAScript 词法环境全解析
前端
青青家的小灰灰1 小时前
React 架构进阶:自定义 Hooks 的高级设计模式与最佳实践
前端·react.js·前端框架
Angelial1 小时前
Vite 性能瓶颈排查标准流程
前端
不要秃头啊1 小时前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
青青家的小灰灰1 小时前
深入理解事件循环:异步编程的基石
前端·javascript·面试
用泥种荷花2 小时前
【LangChain.js学习】 向量数据库(内存/持久化)
前端
simon_luv_pho2 小时前
一行代码把网页变成 AI Agent?
前端