上篇文章搞定了在 Spring AI 中接入高德地图 MCP,让 AI 拥有查实时天气和路线规划的能力。
但遇到另一个问题:大模型根本不知道现在是几点、今天是几号。
你问它“现在几点?帮我设一个10分钟后的闹钟”,它不仅回答不上来,还可能拿训练数据里的历史时间胡乱猜一个。(写到这儿我突然想到:上次我一时记混了日子,把刚写好的需求推上线,结果把前一天的测试数据全覆盖了了,被盯着改代码到半夜
)
分两步走:
@Tool 工具类,让当前项目的 ChatClient 能获取系统时间和设置闹钟。在没有给项目配置时间工具前,我们在聊天界面询问:“现在几点?”:

AI没有实时时间访问权限,只能老实说不知道。
Spring AI 的 @Tool 注解可以解决这个问题,允许我们把 Java 方法直接变成大模型可以调用的工具。
定义“获取当前时间”与“设置闹钟”两个,代码如下:
package org.example.spring_chat_box.tool;import org.springframework.ai.tool.annotation.Tool;import org.springframework.ai.tool.annotation.ToolParam;import org.springframework.context.i18n.LocaleContextHolder;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;/** * 获取当前时间及设置闹钟的工具 */public class DateTimeTools { @Tool(description = "Get the current date and time in the user's timezone") String getCurrentDateTime() { System.out.println("Get the current date!"); return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString(); } @Tool(description = "Set a user alarm for the given time") void setAlarm(@ToolParam(description = "Time format", required = true) String time) { LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME); System.out.println("Alarm set for " + alarmTime); }}在 ChatController.java 中,将编写好的 DateTimeTools 添加到 ChatClient 请求构建器中:
ChatClient.ChatClientRequestSpec requestSpec = chatClient.prompt() .user(prompt) .advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId)) .advisors(new ToolSimpleLoggerAdvisor()) .toolCallbacks(toolCallbackProvider) .tools(new DateTimeTools()); // 挂载本地时间与闹钟工具本地工具调用的完整流程图如下:
再次向 AI 提问:“现在几点?”:
AI 准确识别并调用了 getCurrentDateTime 工具,吐出了当前精确的年月日与系统时间。
查看后端控制台日志:

在 ToolCallingObservationHandler 日志中,清晰展示了 getCurrentDateTime 的 Schema 结构、请求入参以及执行返回的精确时间戳。
搞个图对比下:未挂载工具时,AI 坦承无法获取系统时间;而在挂载 DateTimeTools 后,无论是询问“当前时间”还是指令“设置 10 分钟后的闹钟”,AI 都能精准识别意图并触发对应的 Tool 完成交互:

本地工具只能跑在当前进程里。
如果想把这些能力暴露出去,让 Cherry Studio 或其他 AI 客户端也能调用,就需要把它升级为 MCP 服务端(MCP Server)。
在 pom.xml 中引入 spring-ai-starter-mcp-server-webmvc:
<!-- 引入 mcp-server 依赖,创建获取当前时间及设置闹钟的 MCP 服务端,提供给外部 MCP 客户端使用 --><dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency>在 application.properties 中添加 MCP Server 相关配置,暴露 SSE 端点:
# 创建的 MCP 服务器配置(获取当前时间及设置闹钟的 MCP 服务端)spring.ai.mcp.server.name=webmvc-mcp-serverspring.ai.mcp.server.version=1.0.0spring.ai.mcp.server.type=syncspring.ai.mcp.server.stdio=falsespring.ai.mcp.server.instructions=This server provides time manager toolsspring.ai.mcp.server.sse-endpoint=/sse在 Spring AI 中暴露 MCP 服务端非常简单,只要声明一个 ToolCallbackProvider Bean,Spring AI 的自动配置就会帮你完成后续的转换与 SSE 路由注册:
package org.example.spring_chat_box.config;import org.example.spring_chat_box.tool.DateTimeTools;import org.springframework.ai.tool.ToolCallbackProvider;import org.springframework.ai.tool.method.MethodToolCallbackProvider;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;/** * 将添加的工具转成 MethodToolCallbackProvider,交给 Spring 管理 * 自动将工具转成 MCP 服务工具,供外部 MCP Client 调用 */@Componentpublic class McpServerConfig { @Bean public ToolCallbackProvider timeTools() { return MethodToolCallbackProvider.builder() .toolObjects(new DateTimeTools()) .build(); }}从本地 Tool 升级为 MCP 服务端后,涉及到Cherry Studio、外部大模型、Spring Boot MCP三个应用的交互。
搞个图捋一捋:
启动应用(运行在 9099 端口),下面我们使用第三方 MCP 客户端 Cherry Studio (v1.6.5) 进行跨应用调用测试。
打开 Cherry Studio 设置 -> MCP 服务,新增一个 SSE 类型的 MCP 服务器,连接地址填入 http://localhost:9099/sse:

刷新后,Cherry Studio 成功与我们的 Spring Boot 应用建立握手,并自动识别出了由 DateTimeTools 暴露的 MCP 工具列表(跨进程一次性调通,这爽感谁懂啊
)
在 Cherry Studio 聊天窗口中,分别发起“获取当前时间”和“设置一个闹钟”的请求:

Cherry Studio 自动解析了工具定义,触发调用 9099 端口的 MCP 服务端,并准确返回了时间与闹钟设置结果。
查看 Spring Boot 应用控制台日志:

控制台日志显示 Registered tools 注册的工具数量,并且输出了 Cherry Studio 通过 SSE 调用的请求参数与执行打印(如 Get the current date! 和 Alarm set for ...)
两个需要注意的地方:
spring.ai.mcp.server.sse-endpoint=/sse 配好后,如果项目设置了 context-path 或自定义端口(如 9099),客户端连接 URL 要写完整,例如 http://localhost:9099/sse@ToolParam 时,尽量给出明确的 description 和示例格式(比如 ISO 时间字符串),大模型在跨应用调用时传参准确率会高很多。代码已经传到仓库了,切过去就能跑。要是跑不通,先看看 Cherry Studio 的端口和 SSE 地址拼对没
我是麻雀,6年央国企实战派,专注 Spring AI + AI原生开发实战!
🎁 开源代码与福利:
👉 如果觉得本文对你有帮助,欢迎【点赞 + 收藏 + 转发】,有问题评论区交流。