Spring AI使用MCP的简单流程

  1. 引入依赖 :Spring 项目添加 MCP 客户端依赖(如 spring-ai-mcp-client-spring-boot-starter)。
xml 复制代码
<!-- Spring AI MCP 客户端 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
    <version>1.0.0-M6</version>
</dependency>
  1. 配置 Server 信息 :在 application.ymlmcp-servers-config.json 中定义 Server 的启动命令、参数和环境变量。可选stdio/SSE两种模
yaml 复制代码
spring:
  ai:
    mcp:
      client:
        # 1. STDIO本地配置:用于和一个本地MCP服务进程交互
        stdio:
          # 指定MCP服务器配置文件路径(推荐)
          servers-configuration: classpath:/mcp-servers-config.json
        # 2. SSE用于和远程的MCP服务器交互
        sse:
          connections:
            # 需要配置远程服务器地址
            server1:
              # 在本机的另一个8127端口启动MCP Server代码模拟远程MCP服务
              url: http://localhost:8127
json 复制代码
{
  "mcpServers": {
    "amap-maps": {
      "command": "npx.cmd",
      "args": [
        "-y",
        "@amap/amap-maps-mcp-server"
      ],
      "env": {
        "AMAP_MAPS_API_KEY": "用户在高德开放平台申请的api-key"
      }
    }
  }
}
  1. 启动时拉取并启动 Server :Spring 通过 npx 调用本地或远程的 MCP Server 包,npx 会自动下载并启动服务端进程。
  2. 客户端与 Server 交互 :通过 stdioSSE 建立连接,客户端请求工具列表并调用工具。比如McpSyncClient源码中有listTools()方法可以从Mcp Server中获取注册的工具列表
java 复制代码
/**
 * Retrieves the list of all tools provided by the server.
 * @return The list of tools result containing: - tools: List of available tools, each
 * with a name, description, and input schema 
 */
public McpSchema.ListToolsResult listTools() {
    return this.delegate.listTools().block();
}
  1. 工具注入与调用MCP的本质就是工具调用 , 通过 ToolCallbackProvider 将 Server 的工具注册为 Spring Bean。在代码中向AI发送请求时候在chatClient绑定tools参数传入toolCallbackProvider实例即可使用。
java 复制代码
@Resource
private ToolCallbackProvider toolCallbackProvider;

public String doChatWithMcp(String message, String chatId) {
    ChatResponse response = chatClient.prompt().user(message).
            // 使用方式和工具调用几乎一致,只需要修改tools传入参数即可
            .tools(toolCallbackProvider).call().chatResponse();
    String content = response.getResult().getOutput().getText();
    return content;
}
相关推荐
先睡2 小时前
Redis的缓存击穿和缓存雪崩
redis·spring·缓存
Piper蛋窝5 小时前
深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder
后端·go
Bug退退退1236 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
六毛的毛8 小时前
Springboot开发常见注解一览
java·spring boot·后端
AntBlack8 小时前
拖了五个月 ,不当韭菜体验版算是正式发布了
前端·后端·python
31535669138 小时前
一个简单的脚本,让pdf开启夜间模式
前端·后端
uzong8 小时前
curl案例讲解
后端
一只叫煤球的猫9 小时前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
大鸡腿同学10 小时前
身弱武修法:玄之又玄,奇妙之门
后端
轻语呢喃12 小时前
JavaScript :字符串模板——优雅编程的基石
前端·javascript·后端