找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3062

积分

0

好友

412

主题
发表于 9 小时前 | 查看: 5| 回复: 0

在 AI 应用开发的新浪潮中,如何让已有的服务能力被大语言模型(LLM)理解和调用,成为了一个关键问题。Model Context Protocol(MCP)提供了一种标准化的声明式描述方案,而 Spring AI 则为其提供了优雅的 Java 实现。但为每一个存量 REST 服务手动编写 MCP Tool 注解,无疑是一项繁琐的工作。

有没有一种方法,可以一键将现有的 Spring REST Controller 转换为 MCP 服务呢?答案是肯定的。本文将介绍如何利用 OpenRewrite 这一强大的自动化代码重构框架,通过一条命令,自动化完成从 Spring REST 服务到 MCP 服务的代码转换,让您的存量 API 快速拥抱 AI 智能体生态。

从 Spring AI MCP 到自动化转换的思考

在深入了解自动化方案前,我们先快速回顾一下如何基于 Spring AI 开发一个 MCP 服务。这有助于理解我们最终要自动生成的目标代码结构。

Spring AI MCP 提供了 @Tool@ToolParam 注解,能够将普通的 Spring Bean 方法暴露为 MCP 工具。一个简单的服务类如下所示:

@Service
public class HelloService {

    @Tool(description = "say hello")
    public String hello() {
        return "hello, devops";
    }

    @Tool(description = "say hello to someone")
    public String helloTo(@ToolParam(description = "name of the guy you want to say hello to") String name) {
        return "Hello, " + name;
    }
}

通过配置一个 ToolCallbackProvider Bean 来注册这些工具,并在 application.yml 中配置 MCP 服务器信息后,一个基于 SSE 传输的 MCP 服务就搭建完成了。你可以使用官方的 MCP Inspector 工具进行连接和测试。

MCP Inspector 测试 helloTo 工具

观察上面的代码,你会发现这种使用注解声明工具的方式,与编写 Spring Web 的 @RestController 非常相似。一个典型的 Controller 可能是这样的:

@RestController
public class HelloController {

    /**
     * say hello
     *
     * @return hardcoded hello world
     */
    @GetMapping("/hi")
    public String hello() {
        return "Hello, world";
    }

    /**
     * say hello to some guy
     *
     * @param name name of the guy you want to say hello
     * @return hello message
     */
    @GetMapping("/hi/{name}")
    public String helloTo(@PathVariable("name") String name) {
        return "Hello, " + name;
    }
}

两者在结构上高度一致:方法本身是实现逻辑,差异主要在于注解和描述信息。Controller 的 JavaDoc 中已经包含了方法的描述(say hello)和参数描述(name of the guy...),而这正是 MCP 的 @Tool@ToolParam 注解所需的 description 字段。

于是,一个很自然的想法产生了:能否通过自动化工具,将现有 Controller 的 JavaDoc 和 Web 注解,自动转换为对应的 MCP 工具注解,从而“无侵入”地让 REST 服务同时具备 MCP 能力?

利用 OpenRewrite 实现自动化重构

这就是 OpenRewrite 大显身手的地方。OpenRewrite 是一个开源的自动化代码重构框架。它不同于简单的文本替换,而是基于无损语义树(LST)进行代码分析,可以理解代码的语义结构,从而进行精准、安全的转换。

为了实现 Spring REST 到 MCP 的转换,我们需要一个特定的 OpenRewrite 配方(Recipe)。这个配方需要完成以下几项核心工作:

  1. 扫描所有带有 @RestController 注解的类。
  2. 识别其中带有 @GetMapping, @PostMapping 等请求映射注解的方法。
  3. 提取方法 JavaDoc 中的描述和 @param 描述。
  4. 为方法添加 @Tool(description = “提取的描述”) 注解。
  5. 为方法的参数添加 @ToolParam(description = “提取的参数描述”) 注解。
  6. 在项目的 Maven POM 文件中自动添加所需的 spring-ai-starter-mcp-server-webmvc 依赖。
  7. 在应用主类中自动生成注册 ToolCallbackProvider 的 Bean 定义。

我已经将实现此功能的配方项目开源在了 GitHub:spring-rest-to-mcp。使用它,转换效果如下:

转换前的 Spring REST Controller:

@RestController
public class UserController {
    /**
     * Get all users
     *
     * @return list of users
     */
    @GetMapping("/users")
    public List<User> getUsers() {
        //Implementation
    }

    /**
     * Add a new user
     *
     * @param user user to add
     * @return success message
     */
    @PostMapping("/users")
    public String addUser(User user) {
        //Implementation
    }
}

转换后的 Controller(同时兼容 REST 和 MCP):

@RestController
public class UserController {
    /**
     * Get all users
     *
     * @return list of users
     */
    @GetMapping("/users")
    @Tool(description = “Get all users”)
    public List<User> getUsers() {
        //Implementation
    }

    /**
     * Add a new user
     *
     * @param user user to add
     * @return success message
     */
    @PostMapping(“/users”)
    @Tool(description = “Add a new user”)
    public String addUser(@ToolParam(description = “user to add”) User user) {
        //Implementation
    }
}

可以看到,原始的业务逻辑代码完全没有被改动,只是智能地附加了 MCP 所需的注解,并保持了原有的 REST API 功能。这对于 Java 开发者升级现有项目非常友好。

实战演示:一键转换与智能体调用

让我们通过一个完整的例子,看看如何实际操作。

1. 环境与项目准备

首先,你需要一个基于 Spring Boot 3.x 的 REST API 项目。这里我们使用一个示例项目:

git clone https://github.com/addozhang/spring-boot-3-rest-api-sample.git
cd spring-boot-3-rest-api-sample

这是一个标准的包含用户管理接口的 Spring Boot 项目。

2. 执行自动化转换命令

在项目根目录下,运行以下 Maven 命令。该命令会调用我们编写好的 OpenRewrite 配方,自动完成所有代码和依赖的修改。

mvn org.openrewrite.maven:rewrite-maven-plugin:6.4.0:run \
  -Drewrite.activeRecipes=RewriteWebToMCP \
  -Drewrite.recipeArtifactCoordinates=com.atbug.rewrite:web-to-mcp:1.0-SNAPSHOT \
  -Drewrite.exportDatatables=true

运行结束后,检查你的 UserController,会发现已经自动加上了 @Tool@ToolParam 注解。同时,pom.xml 中已加入 MCP 依赖,主应用类中也生成了 ToolCallbackProvider Bean。

3. 启动转换后的服务

启动服务,它现在既是一个 REST API 服务器,也是一个 MCP 服务器(SSE 端点默认为 /sse)。

mvn spring-boot:run

4. 配置 AI 智能体进行测试

我们使用 VSCode 下的 Cline 智能体配合 DeepSeek API 进行测试。在 Cline 配置中添加 MCP 服务器:

{
  “mcpServers”: {
    “spring-ai-mcp-sample”: {
      “autoApprove”: [],
      “disabled”: false,
      “timeout”: 60,
      “url”: “http://localhost:8080/sse“,
      “transportType”: “sse”
    }
  }
}

配置成功后,Cline 会自动发现该 MCP 服务提供的所有工具。

Cline 中显示的 MCP 工具列表

5. 执行多步骤智能任务

现在,你可以向 AI 智能体发出一个需要组合多个工具调用的复杂指令了:

“先帮我查看一下用户列表,检查是否包含名为 Carson 的用户。如果没有,就添加一个新用户:Carson carson@gmail.com;再查询下列表查看新用户是否添加成功。最后向 Carson 打个招呼。”

智能体会自动规划步骤:调用 getUsers 工具查询 -> 判断无 Carson -> 调用 addUser 工具添加 -> 再次调用 getUsers 确认 -> 调用 helloTo 工具问候。整个过程完全自动化,无需人工干预。

Cline 智能体自动编排任务执行过程

总结与展望

通过 OpenRewrite 框架,我们实现了将存量 Spring REST 服务“一键”转换为 MCP 服务的自动化流程。这项技术的关键价值在于:

  • 无缝迁移:无需重写任何业务逻辑代码,利用现有的 JavaDoc 即可生成 MCP 描述。
  • 双重协议:转换后的服务同时支持原有的 RESTful API 和新的 MCP 协议,平滑过渡。
  • 提升效率:极大降低了将传统微服务接入 AI 智能体生态的门槛和成本。

这仅仅是开始。随着 MCP 协议的演进和 开源实战 工具的丰富,我们可以预见更多类似的自动化桥接方案会出现。无论是数据库、消息队列还是内部 RPC 服务,未来都有可能通过声明式描述和自动化工具,快速转变为 AI 可理解、可编排的“智能模块”。

这种方法为我们打开了一扇窗,让我们看到在 AI 原生应用的时代,庞大的存量技术资产并非包袱,而是可以通过巧妙的“适配器”模式,持续发挥价值的宝藏。如果你正在探索如何让你们的 Spring Boot 服务与 LLM 结合,不妨从这个自动化转换工具开始尝试。




上一篇:Chrome DevTools MCP:为AI Agent注入浏览器调试感知能力
下一篇:Harness Engineering:AI 不会解决你的文档与流程债务,只会让你加倍偿还
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 16:54 , Processed in 0.691699 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表