专栏:Spring AI 探索手札

个人主页:手握风云

目录

一、自定义 MCP Server

二、 Stdio 本地服务

2.1. 项目搭建

2.2. 自定义业务工具开发

2.3. 配置文件

2.4. 客户端调用方式

2.5. HTTP 流式远程服务


一、自定义 MCP Server

        开发者可按需封装自有业务工具(如用户信息查询、内部业务接口),打包为标准 MCP Server,供 Cursor、Cline、Spring AI 应用等任意 MCP 客户端标准化调用,实现业务能力跨 AI 应用复用。

        提供两种主流传输实现:

  1. STDIO:本地进程间通信,适合本地 IDE 客户端(Cursor/Cline)本地调用;
  2. SSE:HTTP 流式长连接,适合远程分布式部署、多服务跨机器调用。

二、 Stdio 本地服务

2.1. 项目搭建

        核心依赖:

<!-- MCP STDIO服务端核心启动器 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

        打包插件:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>3.5.3</version>
		</plugin>
	</plugins>
</build>

2.2. 自定义业务工具开发

        定义数据实体:

package com.yang.mcp.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class UserInfo {
    private String name;
    private Integer age;
    private String sex;
    private String address;
}

        编写业务 Service,使用 @Tool 注解标记对外暴露的工具方法,描述工具作用、入参。

package com.yang.mcp.service;

import com.yang.mcp.entity.UserInfo;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

import java.util.HashMap;
import java.util.Map;

@Service
public class UserService {
    static Map<String, UserInfo> userInfoMap = new HashMap<>();

    static {
        userInfoMap.put("zhangsan", new UserInfo("zhangsan", 15, "男", "北京"));
        userInfoMap.put("lisi", new UserInfo("lisi", 16, "男", "上海"));
        userInfoMap.put("wangwu", new UserInfo("wangwu", 17, "男", "广州"));
        userInfoMap.put("zhaoliu", new UserInfo("zhaoliu", 18, "女", "深圳"));
        userInfoMap.put("sunqi", new UserInfo("sunqi", 19, "女", "香港"));
        userInfoMap.put("zhaoba", new UserInfo("zhaoba", 20, "女", "澳门"));
    }

    @Tool(description = "根据用户的姓名, 返回用户信息")
    public String getUserInfo(@ToolParam(description = "用户姓名") String name) {
        if (userInfoMap.containsKey(name)) {
            return userInfoMap.get(name).toString();
        }
        
        return "用户不存在";
    }
}

        配置 Bean,将工具注册为 MCP 可识别回调:

package com.yang.mcp.config;

import com.yang.mcp.service.UserService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ToolConfig {
    @Bean
    public ToolCallbackProvider getUserInfo(UserService userService) {
        return MethodToolCallbackProvider.builder()
                .toolObjects(userService)
                .build();
    }
}

2.3. 配置文件

spring:
  ai:
    mcp:
      server:
        name: user-info
        version: 0.0.1
  main:
    web-application-type: none # 关闭web服务,纯STDIO进程
    banner-mode: off

        执行 mvn package 生成 target 下可执行 jar;客户端通过 java -jar 命令拉起该进程,通过标准输入输出(stdin/stdout)完成 MCP 通信。

2.4. 客户端调用方式

  • Cursor IDE 客户端调用

        在 mcp.json 配置本地 jar 启动命令:

"user-info": {
  "command": "java",
  "args": [
    "-Dspring.ai.mcp.server.stdio=true",
    "-Dlogging.pattern.console=",
    "-jar",
    "D:\\spring-ai\\spring-ai-project2\\mcp-stdio-server-demo\\target\\mcp-stdio-server-demo-1.0-SNAPSHOT.jar"
  ]
}

        配置完成后列表显示绿色 1 tools enabled 即生效,对话中自然语言提问即可自动调用自定义工具。

  • Spring AI 调用
  1. 在 mcp-servers-config.json 写入上述 jar 启动配置;
  2. 注入 ToolCallbackProvider 到 ChatClient,自动加载本地 MCP 服务的工具;
  3. 接口接收 prompt,AI 自动调用自定义工具返回业务数据。

        测试接口:http://127.0.0.1:8080/chat/generate?message=查询用户 lisi 的信息。

2.5. HTTP 流式远程服务

        二选一 Web 依赖(WebMvc/WebFlux),不可混用:

<!--		传统 Servlet-->
<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>

<!--		响应式-->
<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>

        WebMvc 配置:

server:
  port: 8088
spring:
  ai:
    mcp:
      server:
        name: user-info
        version: 0.0.1

        启动模块,访问:http://127.0.0.1:8088/sse

spring:
  ai:
    mcp:
      client:
        sse:
          connections:
            user-info:
              url: http://127.0.0.1:8088/sse
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐