在 AI Agent 与后端架构融合的浪潮中,如何让大模型安全、稳定地调用业务 API,始终是开发者面临的核心难题。本文将深入解析一种优雅的解决方案:通过 Spring Boot 与 Spring AI 构建 MCP(Model Context Protocol)服务,将传统的 OpenAPI 文档自动转化为大模型可直接使用的工具集,从而打通 AI 与微服务之间的最后一公里。
模块路径:
目标:将任意 OpenAPI/Swagger (3.x) 文档映射为 MCP 的 tools/resources/prompts,让大模型能安全、可控地调用后端接口。
Git 仓库: langchain4j-spring-agent/langchain4j-spring-ai/langchain4j-spring-ai-swagger-mcp
为什么需要 Swagger MCP?
在传统的 AI 集成方案中,大模型往往需要通过拼接 HTTP 请求来调用外部接口,这种方式不仅容易出错,而且难以管理与审计。Swagger MCP 的核心价值在于它彻底改变了这一局面:
- 接口能力规范化:将分散的 API 端点统一转化为 MCP tools,大模型不再需要猜测接口地址和参数格式,直接基于工具定义即可完成调用。
- 治理能力集中化:鉴权、超时控制、限流策略、操作审计等安全机制全部下沉到 MCP 中间层,实现了对下游服务端的统一管控,符合微服务架构下的安全规范。
- 支撑前端自动化:借助 MCP 工具的自省能力,大模型可以读取工具 Schema,进而自动生成前端页面或调用链,极大提升了开发效率。
这种设计思路对于正在构建 AI 原生应用或智能体的团队来说,是一个值得参考的实践方向。具体的模块规划可以参考:langchain4j-spring-ai-swagger-mcp/swagger-mcp-skills-plan.md。
模块架构与启动机制
整个解决方案以一个独立的 Spring Boot 服务形式存在,核心入口为 langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/SwaggerMcpServerApplication.java。该服务对外暴露 MCP Server 能力,支持 SSE(Server-Sent Events)和 stdio 两种通信模式,默认采用 SSE 模式以适配远程调用场景。
在配置层面,开发者可以通过 Spring 配置文件灵活调整服务参数,以下是一个典型的配置示例(源自 application.yml):
server:
port: 3000
transport:
mode: sse
swagger:
mcp:
services:
- serviceKey: local
openapiUrl: http://127.0.0.1:9010/v3/api-docs/default
baseUrl: http://127.0.0.1:9010
toolMode: perOperation
timeoutMs: 8000
maxBodyBytes: 1048576
auth:
type: none实践建议:在微服务架构中,建议将 Swagger MCP 服务作为独立的中间件部署,与业务服务解耦,这样既能保证 MCP 服务的稳定性,又不会影响核心业务链路的性能。
核心组件深度解析
该框架的设计精髓在于将 OpenAPI 到 MCP Tool 的转换过程拆分为多个职责单一的组件,每个组件都专注于解决特定问题,这种模块化设计非常契合后端架构的演进需求。
3.1 OpenApiLoader:文档加载与缓存
该组件(langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/openapi/OpenApiLoader.java)负责从 URL 或本地文件系统加载 OpenAPI 文档。它不仅会将文档解析为 OpenAPI 实例,还会缓存原始的 JSON Map 以便快速访问。对于需要鉴权才能访问的文档,它还支持配置自定义 Headers,确保在私有化部署环境中也能顺利拉取文档。
3.2 OpenApiNormalizer:接口结构规整
由于不同团队的 OpenAPI 文档编写风格各异,直接解析往往会导致结构不一致。OpenApiNormalizer(langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/openapi/OpenApiNormalizer.java)的作用就是将这些异构的文档统一规整为标准化格式。它会自动补齐缺失的 operationId 字段,并提取出参数、requestBody、response schema 等关键元数据,为后续的工具生成奠定坚实基础。
3.3 ToolSpecFactory:工具规范生成
ToolSpecFactory(langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/openapi/ToolSpecFactory.java)负责生成 MCP 工具的定义规范。它会根据规整后的 operation 信息生成工具名称(格式为 svc.{serviceKey}.{operationId}),并将参数和请求体映射为符合 MCP 协议的 input schema。这一步相当于为每个 API 接口创建了一份“使用说明书”,让大模型能够准确理解如何调用。
3.4 OpenApiInvoker:HTTP 请求执行器
当大模型决定调用某个工具时,OpenApiInvoker(langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/openapi/OpenApiInvoker.java)会接收 operationId 和参数列表,拼装出真实的 HTTP 请求并发送到目标服务端。它支持 body 参数和 header 注入,并内置了超时控制和最大响应体限制,防止下游服务异常导致 MCP 服务资源耗尽。
3.5 SwaggerCallTool:MCP 工具统一入口
作为对外的门面,SwaggerCallTool(langchain4j-spring-ai-swagger-mcp/src/main/java/com/soft/nda/swagger/tools/SwaggerCallTool.java)暴露了多个核心工具,主要包括:
listApis:列出当前 MCP 服务下所有已加载的 OpenAPI 服务列表。listOperations:分页返回指定服务的 operationId 列表,方便大模型浏览可用的操作。call:通用调用入口,通过传入 serviceKey、operationId 和 args 参数即可发起任意 API 调用。getComponents/getInfo/getServers/getPaths:提供自省能力,让大模型能够了解工具的参数结构。
✅ 设计亮点:通过将“列出服务”、“列出操作”和“执行调用”分离,使得 MCP 工具具备良好的可发现性和可操作性,大模型可以在运行时动态探索 API 能力。
MCP 服务配置与启动流程
Spring 配置入口位于 SwaggerMcpServerConfig,开发者可以根据实际部署环境选择 SSE 或 stdio 模式。该配置类会自动将上述核心组件注册到 MCP Server 中,并支持请求日志过滤,方便排查问题。
在 Windows CMD 环境下,典型的启动命令如下:
cd /d D:\workspace\langchain4j-spring-agent\langchain4j-spring-ai
mvn -pl langchain4j-spring-ai-swagger-mcp -am spring-boot:run⚠️ 注意事项:在生产环境部署时,建议配置 JVM 内存参数和日志级别,并确保 MCP 服务与下游 API 服务之间的网络策略正确配置,避免因防火墙导致调用超时。
[AFFILIATE_SLOT_1]
完整调用闭环:SSE 模式实战演练
理解了组件构成后,我们通过 SSE 模式走一遍完整的调用流程。完整流程细节可参考:langchain4j-spring-ai-swagger-mcp/doc/swagger-mcp-call.md。
5.1 建立 SSE 会话
首先,客户端需要发起 SSE 连接以获取会话端点:
curl.exe -N "http://127.0.0.1:3000/sse"拿到返回的 sessionId 后,将其拼接为 message endpoint,用于后续的消息交互。
5.2 列出可用工具
通过 tools/list 方法,大模型可以获取当前 MCP Server 上所有可用的工具列表:
curl.exe -X POST "http://127.0.0.1:3000/mcp/message?sessionId=你的sessionId" ^
-H "Content-Type: application/json" ^
-d "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"tools/list\",\"params\":{}}"5.3 获取 operationId 列表
在调用具体接口前,需要先查询某个服务下的操作列表:
curl.exe -X POST "http://127.0.0.1:3000/mcp/message?sessionId=你的sessionId" ^
-H "Content-Type: application/json" ^
-d "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"method\":\"tools/call\",\"params\":{\"name\":\"listOperations\",\"arguments\":{\"serviceKey\":\"local\"}}}"5.4 发起通用调用
最后,通过 tools/call 方法传入 serviceKey、operationId 和参数,即可触发真实的下游 API 调用:
curl.exe -X POST "http://127.0.0.1:3000/mcp/message?sessionId=你的sessionId" ^
-H "Content-Type: application/json" ^
-d "{\"jsonrpc\":\"2.0\",\"id\":\"3\",\"method\":\"tools/call\",\"params\":{\"name\":\"call\",\"arguments\":{\"serviceKey\":\"local\",\"operationId\":\"getUserById\",\"args\":{\"id\":\"123\"}}}}"效率提升:借助这套闭环,大模型可以在毫秒级完成从“理解接口”到“调用接口”的全过程,不再需要人工编写复杂的 HTTP 客户端代码。
设计要点与可扩展性探讨
为了让 Swagger MCP 更好地融入现有的后端架构,以下几个设计要点值得关注:
- 工具模式切换:支持
perOperation(默认)和callOnly两种模式,开发者可以根据大模型的能力选择更合适的工具组织方式。 - 鉴权集中化:对于需要认证的 API,可以在 MCP 层统一注入 bearer token、apiKey 或 basic auth 凭证,避免下游服务重复实现鉴权逻辑,提升安全性。
- 安全边界控制:可以对 OpenAPI 文档的拉取和下游 API 的调用进行 IP 白名单、调用频次等限制,防止恶意调用。
- 缓存与热更新:当 OpenAPI 文档更新时,可以通过
reload强制刷新缓存,无需重启服务即可加载最新接口定义。
[AFFILIATE_SLOT_2]
常见问题与排障思路
在实际落地过程中,开发者可能会遇到以下问题,这里提供一些排查方向:
tools/list为空:首先确认 MCP 服务是否已正常启动,以及客户端连接的服务端口是否正确。listOperations为空:通常是 OpenAPI 文档解析失败或文档地址不可达,检查网络连通性和文档格式。call报operation not found:说明传入的 operationId 不存在,确认是否已加载对应的 OpenAPI 服务。
更多排错细节可以参考:langchain4j-spring-ai-swagger-mcp/doc/swagger-mcp-call.md。
小结与展望
Swagger MCP 的核心思路可以概括为一句话:把 OpenAPI 翻译成 LLM 能稳定执行的 MCP 工具。它有效解决了大模型无法稳定调用接口的痛点,并将鉴权、限流、日志等治理能力集中到中间层,是 AI Agent 生产环境接入的可靠选择。如果你正在探索“模型 + 业务系统”的落地路径,建议优先将接口能力工具化,再逐步完善提示词工程与前端自动化。
langchain4j-spring-ai-swagger-mcp
浙公网安备 33010602011771号