Spring MCP客户端McpAsyncClient依赖缺失,无法初始化问题求助
Spring MCP客户端McpAsyncClient Bean缺失问题排查与修复
问题背景
我正在尝试使用Spring MCP功能,本地8080端口已启动带有两个基础工具的MCP服务器。现在想搭建简单MCP客户端与服务器连接,不使用ChatClient,手动探索CallToolRequest/Response方法,但配置好属性后,McpAsyncClient未被初始化,出现Bean依赖缺失错误。
现有代码与配置
启动类代码
package com.saurabh.learn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MCPClientApplication { public static void main(String[] args) { SpringApplication.run(MCPClientApplication.class, args); } }
MCP控制器代码
package com.saurabh.learn.controllers; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import io.modelcontextprotocol.client.McpAsyncClient; import io.modelcontextprotocol.spec.McpSchema.CallToolRequest; import io.modelcontextprotocol.spec.McpSchema.CallToolResult; import jakarta.annotation.PostConstruct; import reactor.core.publisher.Mono;; @Component public class MCPController { @Autowired McpAsyncClient mcpClient; public MCPController(McpAsyncClient mcpClient) { this.mcpClient = mcpClient; System.out.println("Async MCP client: " + this.mcpClient); } public void callToolDirectly() { CallToolRequest toolCallRequest = new CallToolRequest("getPersonById", Map.of("id", 3146644)); Mono<CallToolResult> toolCallResponse = mcpClient.callTool(toolCallRequest); System.out.println("Tool call response: " + toolCallResponse.block()); } }
配置文件
spring.application.name=learn server.port= 8090 spring.ai.mcp.client.name=learn-mcp-client spring.ai.mcp.client.version=1.0.0 spring.ai.mcp.client.initialized=true spring.ai.mcp.client.sse.connections.mcp-server.url=http://localhost:8080 spring.ai.mcp.client.sse.connections.mcp-server.sse-endpoint=/sse # tried below way as well # spring.ai.mcp.client.sse.connections.[mcp-server].url=http://localhost:8080 # spring.ai.mcp.client.sse.connections.[mcp-server].sse-endpoint=/sse spring.ai.mcp.client.enabled=true spring.ai.mcp.client.type=ASYNC
问题排查与修复步骤
1. 确认依赖是否正确引入
Spring AI MCP Client的自动配置依赖对应的starter包,需确保构建文件中包含该依赖:
Maven(pom.xml)
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client</artifactId> <!-- 使用与你的Spring Boot版本匹配的Spring AI版本 --> <version>1.0.0-M1</version> </dependency>
Gradle(build.gradle)
implementation 'org.springframework.ai:spring-ai-mcp-client:1.0.0-M1'
2. 修复Bean注入方式
你的MCPController同时使用了构造函数注入和字段@Autowired,这种冗余写法会导致Spring无法正确解析依赖注入逻辑。只需保留构造函数注入即可:
修改后的MCPController代码:
package com.saurabh.learn.controllers; import java.util.Map; import org.springframework.stereotype.Component; import io.modelcontextprotocol.client.McpAsyncClient; import io.modelcontextprotocol.spec.McpSchema.CallToolRequest; import io.modelcontextprotocol.spec.McpSchema.CallToolResult; import jakarta.annotation.PostConstruct; import reactor.core.publisher.Mono;; @Component public class MCPController { private final McpAsyncClient mcpClient; // 仅保留构造函数注入,移除字段上的@Autowired public MCPController(McpAsyncClient mcpClient) { this.mcpClient = mcpClient; System.out.println("Async MCP client: " + this.mcpClient); } public void callToolDirectly() { CallToolRequest toolCallRequest = new CallToolRequest("getPersonById", Map.of("id", 3146644)); Mono<CallToolResult> toolCallResponse = mcpClient.callTool(toolCallRequest); System.out.println("Tool call response: " + toolCallResponse.block()); } // 可选:添加PostConstruct触发调用,验证连接 @PostConstruct public void init() { callToolDirectly(); } }
3. 简化配置文件
配置中的部分属性为默认值,可简化以避免冲突:
spring.application.name=learn server.port=8090 spring.ai.mcp.client.name=learn-mcp-client spring.ai.mcp.client.version=1.0.0 spring.ai.mcp.client.sse.connections.mcp-server.url=http://localhost:8080 spring.ai.mcp.client.sse.connections.mcp-server.sse-endpoint=/sse spring.ai.mcp.client.enabled=true spring.ai.mcp.client.type=ASYNC
注:spring.ai.mcp.client.initialized默认值为true,无需显式配置。
4. 验证自动配置是否生效
确保@SpringBootApplication注解的扫描范围包含org.springframework.ai.mcp包,默认情况下@SpringBootApplication会自动扫描所有自动配置类,只要依赖正确,McpAsyncClientAutoConfiguration会自动创建McpAsyncClient Bean。
内容的提问来源于stack exchange,提问作者Saurabh Tiwari
相关产品推荐
相关产品推荐

