ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合 1. 为什么 Java 开发者现在要盯紧 MCP如果你是一名 Java 后端最近大概率被两个词反复刷屏MCP 和 Claude。MCP 全称 Model Context Protocol模型上下文协议说白了就是给大模型和各种工具、数据源之间定了一套统一的“插座标准”。以前你想让大模型查个数据库、调个地图 API、操作一下 Git 仓库得自己写一堆胶水代码每个模型厂商的对接方式还不一样现在只要你的服务实现了 MCP 协议任何支持 MCP 的客户端都能直接把它当工具用。这对 Java 开发者意味着什么意味着你手里那些 Spring Boot 服务、内部管理系统、数据查询接口不用大改就能被 AI 智能体调用。你不需要去学 Python 生态那一套Spring AI Alibaba 已经把 MCP 的客户端和服务端能力封装好了注解一加、Bean 一注册你的 Java 方法就变成了大模型可以调用的工具。这篇文章我按真实接入链路来写先在 Claude 桌面端跑通一个本地 MCP Server确认工具能被正确加载和触发再把同样的能力迁移到 Spring AI Alibaba 生态里用 Java 代码作为 MCP Client 去调用它。中间会给出 Claude 配置文件骨架、MCP Server 注册步骤、Spring AI Alibaba 侧的依赖和 Bean 配置片段最后做一次端到端调用验证确认工具调用和模型响应都正常。适合有 Spring Boot 基础、想快速把 MCP 落到 Java 项目里的同学。2. 前置准备TaoToken 与模型接入在动手写 MCP Server 之前得先把模型调用这条链路打通。MCP 负责的是“工具怎么被调用”但真正决定要不要调用工具、怎么组织参数的还是背后的大模型。所以你需要一个能稳定调用 Claude 等模型的入口。我这边用的是 TaoToken 来做模型接入它的 API 地址是 https://taotoken.net/api 兼容常见的调用方式Java 侧用 Spring AI 的 OpenAI 兼容客户端就能直接对接。先去控制台创建一个 API Key地址在 https://taotoken.net/api-keys 创建完复制出来后面配置里要用。如果你只是想先验证模型对话是否正常可以打开模型对话页面 https://taotoken.net/models 直接试一句确认 Key 有效、模型有响应。这一步别跳过因为后面 MCP 工具调用失败时你得能区分是模型链路的问题还是 MCP 配置的问题。对于长期要做编码、跑 Agent 任务的场景可以考虑 Coding Plan https://taotoken.net/coding-plan 额度更划算。接入文档在 https://taotoken.net/doc 里面有各语言的调用示例Java 侧照着改 base_url 和 api_key 就行。把 Key 准备好之后我们进入正题先写一个能被 Claude 桌面端识别的 MCP Server。3. 第一步用 Spring AI 写一个 stdio 模式的 MCP ServerMCP Server 有两种主流传输方式stdio 和 SSE。stdio 是标准输入输出适合本地进程Claude 桌面端直接以子进程方式启动它SSE 是 HTTP 长连接适合独立部署、多客户端远程调用。我们先做 stdio 版本因为它最容易在 Claude 里验证。3.1 添加依赖新建一个 Spring Boot 项目在 pom.xml 里加入 MCP Server 的 starterdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-server-spring-boot-starter/artifactId /dependency这个 starter 会把 MCP 服务端的自动配置、工具扫描、stdio 通信都带进来。版本跟随你项目里的 Spring AI BOM 即可。3.2 配置 application.ymlstdio 模式下应用不能以 Web 方式启动否则会占用端口、干扰标准输入输出。配置如下spring: main: web-application-type: none banner-mode: off ai: mcp: server: stdio: true name: my-weather-server version: 0.0.1web-application-type: none是关键少了它启动会报错或者卡住。banner-mode: off是为了避免 banner 输出污染 stdio 通道这个坑我踩过Claude 那边会解析失败。3.3 用 Tool 注解暴露工具方法写一个 Service用Tool标记要被大模型调用的方法用ToolParameter描述参数。这里用 Open-Meteo 这个免费天气 API 做示例不需要申请 KeyService public class WeatherService { private final WebClient webClient; public WeatherService(WebClient.Builder builder) { this.webClient builder.baseUrl(https://api.open-meteo.com/v1).build(); } Tool(description 根据经纬度获取当前天气和未来预报) public String getWeather( ToolParameter(description 纬度例如 39.9042) String latitude, ToolParameter(description 经度例如 116.4074) String longitude) { try { return webClient.get() .uri(uri - uri.path(/forecast) .queryParam(latitude, latitude) .queryParam(longitude, longitude) .queryParam(current, temperature_2m,wind_speed_10m) .queryParam(timezone, auto) .build()) .retrieve() .bodyToMono(String.class) .block(); } catch (Exception e) { return 获取天气失败 e.getMessage(); } } }description写清楚很重要大模型就是靠这段文字判断什么时候该调用这个工具。参数描述也一样写得越具体模型填参数越准。3.4 注册 ToolCallbackProvider在启动类里把工具注册成 BeanSpringBootApplication public class McpServerApplication { public static void main(String[] args) { SpringApplication.run(McpServerApplication.class, args); } Bean public ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); } }打包成 jarmvn clean package -DskipTests记下 jar 的完整路径下一步 Claude 配置里要用绝对路径。4. 第二步在 Claude 桌面端接入并验证Claude 桌面端通过一个 JSON 配置文件来管理 MCP Server。找到配置文件macOS 路径是~/Library/Application Support/Claude/claude_desktop_config.jsonWindows 是%APPDATA%\Claude\claude_desktop_config.json。如果文件不存在就新建一个。4.1 配置文件骨架{ mcpServers: { weather: { command: java, args: [ -Dspring.ai.mcp.server.stdiotrue, -Dspring.main.web-application-typenone, -Dlogging.pattern.console, -jar, /绝对路径/target/mcp-server-0.0.1.jar ], env: {} } } }几个要点-jar后面必须是 jar 的绝对路径相对路径 Claude 解析不到-Dlogging.pattern.console把控制台日志格式清空避免日志混进 stdio 通道-Dspring.main.web-application-typenone再显式声明一次双保险。4.2 重启并确认工具加载保存配置后完全退出 Claude 再重新打开。在输入框附近能看到工具图标点开应该能看到getWeather这个工具说明 MCP Server 被成功拉起、工具被正确注册。4.3 触发一次真实调用输入提示词“帮我查一下北京现在的天气”。Claude 会判断需要调用getWeather自动填入北京对应的经纬度然后返回天气数据。如果能看到温度、风速这些字段说明整条链路通了Claude 发起工具调用 → stdio 传给 Java 进程 → Java 调 Open-Meteo → 结果回传 → 模型组织成自然语言。这一步验证通过说明你的 Java MCP Server 是合格的。接下来把它迁移到 Spring AI Alibaba 生态让 Java 应用自己当客户端。5. 第三步Spring AI Alibaba 作为 MCP Client 调用现在换个角色不再是 Claude 来调你的服务而是你的 Java 应用去调 MCP Server。Spring AI Alibaba 提供了 stdio 和 SSE 两种客户端 starter。5.1 添加客户端依赖dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-client-spring-boot-starter/artifactId /dependency5.2 配置模型与 MCP 服务器spring: ai: openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: claude-3-5-sonnet mcp: client: stdio: servers-configuration: classpath:/mcp-servers-config.jsonbase-url指向 TaoToken 的 API 地址api-key从环境变量注入别硬编码在文件里。模型名按你实际可用的填。5.3 mcp-servers-config.json在src/main/resources下建这个文件内容和 Claude 那份类似{ mcpServers: { weather: { command: java, args: [ -Dspring.ai.mcp.server.stdiotrue, -Dspring.main.web-application-typenone, -Dlogging.pattern.console, -jar, /绝对路径/target/mcp-server-0.0.1.jar ], env: {} } } }5.4 注入工具并调用SpringBootApplication public class ClientApplication { public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } Bean public CommandLineRunner run(ChatClient.Builder builder, ToolCallbackProvider tools, ConfigurableApplicationContext ctx) { return args - { ChatClient chatClient builder.defaultTools(tools).build(); String answer chatClient.prompt(北京的天气怎么样).call().content(); System.out.println( answer); ctx.close(); }; } }defaultTools(tools)这一行就是把 MCP Server 提供的工具挂到 ChatClient 上Spring AI Alibaba 会自动完成工具描述到模型 function calling 格式的适配。启动mvn spring-boot:run日志里会看到 MCP 客户端向服务端发起tools/list请求拿到工具列表然后模型决定调用getWeather返回天气数据。控制台打印出结果说明 Java 作为 MCP Client 的链路也通了。6. 常见报错与排查清单接入过程中最容易卡在几个地方我按出现频率排一下。工具重复注册报错如果你用 SSE 模式可能遇到Multiple tools with the same name。这是 Spring AI 的自动配置类SseHttpClientTransportAutoConfiguration和SseWebFluxTransportAutoConfiguration同时加载导致的两个都去申请了同一批工具。解决办法是在启动类上排除掉其中一个SpringBootApplication(exclude { org.springframework.ai.autoconfigure.mcp.client.SseHttpClientTransportAutoConfiguration.class })Claude 里看不到工具先确认 jar 路径是绝对路径再确认web-application-type: none配了最后看日志有没有输出到 stdout 污染通道。把logging.pattern.console设成空能解决大部分问题。模型不调用工具检查Tool的 description 是不是太模糊模型判断不出该不该用。把描述写具体比如“根据经纬度获取当前天气和未来预报”就比“获取天气”好很多。API Key 无效确认 base-url 是 https://taotoken.net/api Key 从 https://taotoken.net/api-keys 创建别把控制台登录态和 API Key 搞混。模型对话页面 https://taotoken.net/models 可以先单独验证 Key。SSE 模式连不上确认服务端真的在对应端口启动了url配置里别漏了协议头。SSE 服务端需要独立部署不能和 stdio 混在一个进程里。7. 继续往下走到这一步你已经跑通了 Java MCP 的完整链路写 Server、Claude 验证、Spring AI Alibaba 当 Client 调用。接下来可以做的方向很多比如把内部的数据查询接口用Tool包一层让智能体能直接查业务数据或者把 SSE 模式的 Server 部署到内网多个 Agent 共享同一批工具。如果你要长期跑编码类、Agent 类任务建议把模型调用切到 Coding Plan https://taotoken.net/coding-plan 额度更稳。接入细节和更多示例看文档 https://taotoken.net/doc 控制台在 https://taotoken.net/console API Key 管理在 https://taotoken.net/api-keys 。Claude Code 相关的接入说明在 https://taotoken.net/claude-code Anthropic 兼容接入在 https://taotoken.net/anthropic 。MCP 的价值不在于协议本身多复杂而在于它把“工具接入”这件事标准化了。你写的 Java 方法加个注解就能被任何支持 MCP 的智能体调用这才是对 Java 开发者最实在的收益。
返回列表