easy-agent:面向 Spring Boot 的轻量级 Agent 能力组件
介绍最近我的工作主要聚焦在 Agent 和 Skill 相关方向。随着公司多个项目陆续完成 Agent 化升级我发现一个很典型的问题很多企业系统已经沉淀了大量业务能力但这些能力仍然停留在传统接口和服务调用层面大模型无法直接理解和调用。尤其在 Java / Spring Boot 体系中很多系统并不适合推倒重来重新开发一个 Agent 应用。更现实的方式是在尽量不改动原有架构的前提下把已有业务方法、业务工具、知识库和大模型能力连接起来让存量系统逐步具备 Agent 能力。基于这些实践我将项目集成 Agent 的经验进行总结和封装开发了一个可复用组件easy-agent。easy-agent 是一个面向 Java / Spring Boot 应用的轻量级 Agent 能力组件。业务系统引入easy-agent-spring-boot-starter后可以通过简单的EasyTool注解将已有业务方法快速注册为 AI 可调用的工具也可以通过ToolProviderSPI 以编程方式批量注册工具。同时easy-agent 内置 MCP Server使 Claude Code、Codex 等支持 MCP 的 AI 客户端可以直接发现并调用业务系统中的工具。它还提供 LLM、RAG、Skill 等模块帮助业务系统完成从工具注册、模型调用、知识库检索到技能生成的完整 Agent 化链路。easy-agent 的核心目标不是替代业务系统而是作为一个组件嵌入到已有 Spring Boot 项目中让存量业务系统以较低成本获得 Agent 能力。easy-agent 当前支持的能力当前 easy-agent 主要包含以下模块模块说明easy-agent-core核心模块提供工具注解、工具注册中心、工具执行器和 SPI 扩展easy-agent-llmLLM 模块提供 OpenAI 兼容模型调用和自动工具调用能力easy-agent-mcpMCP 模块提供 HTTP JSON-RPC MCP Server让 Claude Code 等客户端调用业务工具easy-agent-ragRAG 模块提供知识库加载、文档分块、检索增强能力easy-agent-skillSkill 模块根据已注册工具生成业务侧 Skill Markdown 文件easy-agent-spring-boot-starterStarter 模块负责 Spring Boot 自动装配和配置元数据整体链路可以理解为Spring Boot 业务系统 ↓ EasyTool / ToolProvider ↓ ToolRegistry ↓ ToolExecutor ↓ LLM / MCP / RAG / Skill ↓ Claude Code / Codex / 企业内部 AI 助手easy-agent 的核心优势面向存量系统而不是重写系统easy-agent 的定位是组件化接入。对于已经存在的 Spring Boot 项目不需要重新搭建一套 Agent 应用只需要在原有系统中引入 starter就可以逐步开放业务能力给大模型和 Agent 客户端调用。注解式工具注册接入成本低通过 EasyTool 注解可以将已有 Java 方法注册为 AI 工具。对于大多数固定业务能力例如查询用户权限、查询需求列表、创建需求、统计周报等只需要在方法上添加注解即可。SPI 扩展支持更灵活的工具来源除了注解式注册easy-agent 还支持 ToolProvider SPI。业务系统可以通过编程方式批量注册工具适合工具定义来自数据库、配置中心、插件系统或运行时动态组装的场景。同时ToolExecutionListener 可以监听工具执行前、执行成功、执行失败三个节点方便业务系统做日志、审计、监控、统计和告警。MCP 原生支持easy-agent 内置 MCP Server。业务系统启动后Claude Code、Codex 等 MCP 客户端可以通过 tools/list 查看工具通过 tools/call 调用工具让业务系统成为 Agent 可调用的能力提供方。覆盖 Agent 化常见链路easy-agent 不只提供工具注册还提供 LLM 调用、RAG 检索增强、Skill 生成等能力覆盖从业务工具暴露到大模型调用、知识库增强和技能沉淀的常见链路。适合企业内部 AI 助手场景对于企业内部系统easy-agent 可以用于构建 AI 助手、知识库问答、业务工具调用、周报生成、需求查询、权限查询等场景让已有业务能力更容易被 AI 使用。如何开始使用 easy-agent1. 引入依赖easy-agent 已经发布到 Maven Central在 Spring Boot 项目中直接引入 easy-agent-spring-boot-starter 即可。dependencygroupIdio.github.songrongzhen/groupIdartifactIdeasy-agent-spring-boot-starter/artifactIdversion0.1.8/version/dependency引入 starter 后easy-agent 会自动装配 core、llm、mcp、rag、skill 等模块。对于大多数 Spring Boot 项目来说不需要手动创建核心组件 Bean。2. 最简配置开启 LLM 对话能力如果只想先体验 LLM 对话能力可以先添加最简配置easy-agent:llm:enabled:truemodel:qwen-plusapi-key:${DASHSCOPE_API_KEY}这里的 model 配置为 qwen-plus 时easy-agent 会自动识别为通义千问兼容模型服务。api-key 建议通过环境变量传入不建议直接写死在 application.yml 中。easy-agent 的 LLM 模块采用 OpenAI 兼容调用方式当前支持通义千问、DeepSeek、Ollama、OpenAI 等模型服务。3. 完整配置开启 MCP、LLM、RAG、Skill如果希望一次性开启 easy-agent 的主要能力可以参考下面这份完整配置。easy-agent:# MCP 配置开启后Claude Code、Codex 等 MCP 客户端可以发现并调用业务工具mcp:enabled:trueserver-name:easy-agent-mcp-serverserver-version:0.1.8cors:enabled:trueallowed-origin-patterns:-http://localhost:*-http://127.0.0.1:*allowed-headers:-*allowed-methods:-GET-POST-OPTIONSexposed-headers:-Content-Type# LLM 配置用于普通对话和自动工具调用llm:enabled:truemodel:qwen-plusapi-key:${DASHSCOPE_API_KEY}# RAG 配置用于知识库检索增强rag:enabled:truestorage-type:IN_MEMORYsearch:strategy:AUTOembedding:enabled:trueprovider:DASHSCOPEmodel:text-embedding-v3cosine:enabled:truetf-idf:enabled:truepdf:enabled:trueresource-path:classpath:knowledge/excel:enabled:trueresource-path:classpath:knowledge/# Skill 配置用于根据已注册工具生成业务侧 Skill Markdown 文件skill:enabled:trueskill-output-path:.需要注意几点第一MCP 模块可以把当前系统中已注册的工具暴露给 MCP 客户端。开启后Claude Code、Codex 等客户端可以通过 tools/list 查看工具通过 tools/call 调用工具。第二LLM 模块用于模型对话和自动工具调用。model 配置为 qwen-plus 时easy-agent 会按通义千问兼容服务处理。第三RAG 模块用于知识库检索增强。上面的配置会从 classpath:knowledge/ 目录加载 PDF 和 Excel 文件使用内存存储适合本地测试和轻量场景。第四Skill 模块用于生成业务侧 Skill Markdown 文件。skill-output-path 表示生成文件的基础目录。配置为 . 时生成文件会写入项目根目录下的 skill/ 目录。使用 EasyTool 暴露业务能力在已有 Spring Bean 的方法上添加 EasyTool 注解就可以把这个方法注册为 AI 可调用的工具。ServicepublicclassRequirementService{EasyTool(namequeryMyRequirements,description查询当前用户的需求列表)publicListRequirementqueryMyRequirements(ToolParam(nameuserId,description用户 ID)StringuserId){returnrequirementRepository.findByUserId(userId);}EasyTool(namecountMyRequirements,description统计当前用户的需求数量)publicRequirementCountcountMyRequirements(ToolParam(nameuserId,description用户 ID)StringuserId){returnrequirementRepository.countByUserId(userId);}}应用启动后easy-agent 会自动扫描 EasyTool 方法并将其注册到 ToolRegistry。后续 LLM、MCP 或 ToolExecutor 都可以调用这个工具。这类方式非常适合固定业务方法例如查询当前用户权限 查询需求列表 查询需求详情 创建需求 统计个人周报 统计团队周报 查询订单信息 执行审批操作使用 ToolProvider 编程式注册工具EasyTool 适合大多数固定 Java 方法但有些场景更适合编程式注册例如工具需要运行时动态组装 工具定义来自数据库或配置中心 工具不是某个固定 Java 方法 业务系统希望批量注册一组工具 插件化系统需要动态扩展工具这时可以使用 ToolProvider SPI。ComponentpublicclassBusinessToolProviderimplementsToolProvider{OverridepublicCollectionToolDefinitionprovide(){returnList.of(newToolDefinition(queryUserPermission,查询当前用户权限,user,permissionService,queryCurrentUserPermission,List.of(newParameterDefinition(userId,用户 ID,String,true)),true));}Overridepublicintpriority(){return0;}}业务系统只需要将 ToolProvider 声明为 Spring Beaneasy-agent 会自动收集所有 ToolProvider并注册其返回的 ToolDefinition。priority() 数值越小注册优先级越高。如果工具名称重复会按照 ToolRegistry 的现有规则进行覆盖。使用 ToolExecutionListener 监听工具执行过程在企业内部系统中工具调用往往需要审计、日志、监控和失败告警。easy-agent 提供了 ToolExecutionListener用于监听工具执行过程。ComponentpublicclassBusinessToolExecutionListenerimplementsToolExecutionListener{OverridepublicvoidbeforeExecution(ToolInvocationinvocation){log.info(准备执行工具{},invocation.toolName());}OverridepublicvoidafterExecution(ToolInvocationinvocation,ToolResultresult){log.info(工具执行成功{},invocation.toolName());}OverridepublicvoidonError(ToolInvocationinvocation,Throwableerror){log.warn(工具执行失败{},invocation.toolName(),error);}}ToolExecutionListener 可以用于记录工具调用日志 统计工具调用次数 记录调用耗时 做审计留痕 失败告警 接入监控系统LLM让大模型自动调用工具easy-agent 的 LLM 模块提供 OpenAI 兼容调用能力并支持自动工具调用闭环。业务系统可以通过 AgentLlmService 让大模型结合已注册工具回答问题。RestControllerRequestMapping(/api)publicclassAgentController{privatefinalAgentLlmServiceagentLlmService;publicAgentController(AgentLlmServiceagentLlmService){this.agentLlmServiceagentLlmService;}GetMapping(/agent)publicChatResponseagent(RequestParamStringmessage){returnagentLlmService.chatWithRegisteredTools(List.of(ChatMessage.user(message)));}}例如用户提问帮我查询一下我当前有哪些需求并统计一下数量。大模型可以根据工具描述自动选择调用queryMyRequirements countMyRequirementsMCP让 Claude Code 调用你的业务工具easy-agent 内置 MCP Server。开启 MCP 后Claude Code 等支持 MCP 的客户端可以直接连接你的 Spring Boot 服务并发现、调用系统中已经注册的工具。1. 启动 Spring Boot 服务假设你的服务地址是http://localhost:8999并且已经开启 MCP 配置easy-agent:mcp:enabled:trueserver-name:easy-agent-mcp-serverserver-version:0.1.8启动成功后easy-agent 会提供 MCP HTTP 接口http://localhost:8999/mcp2. 在 Claude Code 中连接 MCP Server在 Claude Code 中添加 MCP Serverclaude mcpaddeasy-agent http://localhost:8999/mcp如果你的服务部署在其他机器上把 localhost:8999 替换成实际服务地址即可claude mcpaddeasy-agent http://{your-project-address}/mcp连接成功后Claude Code 会通过 tools/list 发现 easy-agent 暴露出来的工具。3. 使用 Claude Code 调用工具连接成功后你不需要手动调用接口直接用自然语言对话即可。例如你的业务系统中已经注册了 add 工具用户帮我计算 3 5 Claude Code调用 add返回 8再比如你的系统中注册了 queryUser 工具用户查询用户 ID 为 123 的信息 Claude Code调用 queryUser返回用户信息这就是 MCP 的价值业务系统不需要专门为 Claude Code 写适配接口只要 easy-agent 把工具暴露出来Claude Code 就可以发现并调用。RAG接入个人知识库做检索增强对于需要结合文档、说明书、规范、周报、需求文档的场景easy-agent 提供 RAG 检索增强能力。当前 RAG 模块支持启动时加载知识库 加载 PDF 文件 加载 Excel 文件 文档分块 内存向量存储 Embedding 检索 Cosine 相似度检索 TF-IDF 检索 运行时添加文档 按 source 删除文档 按 documentId 删除文档 清空索引 重建索引示例使用ServicepublicclassKnowledgeService{privatefinalRagServiceragService;privatefinalLlmServicellmService;publicKnowledgeService(RagServiceragService,LlmServicellmService){this.ragServiceragService;this.llmServicellmService;}publicChatResponseanswerQuestion(Stringquestion){StringcontextragService.searchAndConcat(question,5);returnllmService.chat(List.of(ChatMessage.system(请基于以下知识回答问题\ncontext),ChatMessage.user(question)));}}需要注意的是easy-agent 的 RAG 模块当前默认以内存存储为主适合本地测试、轻量知识库和个人知识库场景。PgVector 配置和占位类已经存在但当前还不是完整可用的持久化向量库实现。另外easy-agent 只提供 RAG Java API不默认暴露文件上传接口。业务系统如果需要运行时上传知识库文件需要自己提供上传接口并负责权限控制、文件大小限制、租户隔离和安全校验。Skill把业务工具沉淀成可复用技能easy-agent 的 Skill 模块用于根据当前系统中已经注册的工具生成业务侧自己的 Skill Markdown 文件。它适合这样的场景系统里已经有多个工具例如查询需求列表、查询需求详情、创建需求、统计个人周报、统计团队周报等。单个工具只能完成一个动作而 Skill 可以把这些工具组织成一个更完整的使用说明让 AI 客户端知道在什么场景下应该如何组合使用这些工具。Skill 生成流程第一步启动业务服务并确保 Skill 模块已开启。easy-agent:skill:enabled:trueskill-output-path:.这里 skill-output-path 配置为 . 时生成的 Skill 文件会写入项目根目录下的 skill/ 目录。第二步在 Claude Code 中连接 easy-agent 的 MCP Server。claude mcpaddeasy-agent http://localhost:8999/mcp第三步在 Claude Code 中告诉它你想创建一个 Skill。例如我想创建一个用于查询个人需求的 Skill。此时 easy-agent 会通过内置的 Skill 生成工具引导你补充关键信息包括Skill 名称 Skill 描述 使用边界 可调用工具 使用示例第四步确认生成。生成完成后Skill Markdown 文件会写入项目根目录下的 skill/ 目录。例如skill/个人需求查询.md如果同名文件已经存在MCP 客户端会询问使用者选择生成副本还是覆盖。当前版本的 Skill 模块主要提供业务 Skill Markdown 文件生成能力不包含 Skill 文件解析、运行时加载、注册中心或文件热更新能力。一个典型使用场景假设企业内部有一个需求管理系统里面已经有这些业务能力查询当前用户权限 查询我的需求列表 查询需求详情 创建需求 统计个人周报 统计团队周报创建属于自己的技能接入 easy-agent 后可以这样改造第一步用 EasyTool 暴露已有业务方法。第二步用 MCP 让 Claude Code 可以发现并调用这些工具。第三步用 LLM 模块让大模型根据用户问题自动选择工具。第四步用 RAG 接入需求文档、项目规范、周报记录等知识库。第五步用 Skill 模块生成“个人需求查询”“周报生成”“需求创建”等业务 Skill。这样原本只能通过页面或接口操作的业务系统就可以逐步变成一个可被 Agent 调用的能力系统。总结easy-agent 的目标很简单让 Java / Spring Boot 存量系统以组件化方式接入 Agent 能力。它不要求你推翻原有系统也不要求你重新搭建一套独立 Agent 应用。对于已有业务系统只需要引入 easy-agent-spring-boot-starter再通过 EasyTool 或 ToolProvider 暴露已有业务能力就可以逐步接入 LLM、MCP、RAG 和 Skill 能力。目前 easy-agent 已经发布到 Maven Central并在 GitHub 获得 200 Stars。这个项目还在持续迭代中后续会继续打磨工具调用、MCP、RAG、Skill 以及更多企业内部 Agent 场景。项目地址https://github.com/songrongzhen/easy-agent如果你也在做 Java 系统的智能化改造或者希望让已有 Spring Boot 系统具备 Agent 能力欢迎试用 easy-agent。开源不易如果这个项目对你有帮助也欢迎在 GitHub 留下一颗 Star。